mirror of
https://github.com/sudo-project/sudo.git
synced 2025-08-22 18:08:23 +00:00
Allocate the data buffer in get_free_buf() too.
We always know the size of the data buffer we need at allocation time.
This commit is contained in:
parent
3dce67ec10
commit
935daf6b7e
@ -142,7 +142,7 @@ connection_closure_free(struct connection_closure *closure)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct connection_buffer *
|
struct connection_buffer *
|
||||||
get_free_buf(struct connection_closure *closure)
|
get_free_buf(size_t len, struct connection_closure *closure)
|
||||||
{
|
{
|
||||||
struct connection_buffer *buf;
|
struct connection_buffer *buf;
|
||||||
debug_decl(get_free_buf, SUDO_DEBUG_UTIL);
|
debug_decl(get_free_buf, SUDO_DEBUG_UTIL);
|
||||||
@ -153,24 +153,29 @@ get_free_buf(struct connection_closure *closure)
|
|||||||
else
|
else
|
||||||
buf = calloc(1, sizeof(*buf));
|
buf = calloc(1, sizeof(*buf));
|
||||||
|
|
||||||
|
if (len > buf->size) {
|
||||||
|
free(buf->data);
|
||||||
|
buf->size = sudo_pow2_roundup(len);
|
||||||
|
if ((buf->data = malloc(buf->size)) == NULL) {
|
||||||
|
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||||
|
"unable to malloc %u", buf->size);
|
||||||
|
free(buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debug_return_ptr(buf);
|
debug_return_ptr(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
fmt_server_message(struct connection_closure *closure, ServerMessage *msg)
|
fmt_server_message(struct connection_closure *closure, ServerMessage *msg)
|
||||||
{
|
{
|
||||||
struct connection_buffer *buf;
|
struct connection_buffer *buf = NULL;
|
||||||
uint32_t msg_len;
|
uint32_t msg_len;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
size_t len;
|
size_t len;
|
||||||
debug_decl(fmt_server_message, SUDO_DEBUG_UTIL);
|
debug_decl(fmt_server_message, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
if ((buf = get_free_buf(closure)) == NULL) {
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
|
||||||
"unable to allocate connection_buffer");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = server_message__get_packed_size(msg);
|
len = server_message__get_packed_size(msg);
|
||||||
if (len > MESSAGE_SIZE_MAX) {
|
if (len > MESSAGE_SIZE_MAX) {
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||||
@ -182,20 +187,14 @@ fmt_server_message(struct connection_closure *closure, ServerMessage *msg)
|
|||||||
msg_len = htonl((uint32_t)len);
|
msg_len = htonl((uint32_t)len);
|
||||||
len += sizeof(msg_len);
|
len += sizeof(msg_len);
|
||||||
|
|
||||||
/* Resize buffer as needed. */
|
|
||||||
if (len > buf->size) {
|
|
||||||
free(buf->data);
|
|
||||||
buf->size = sudo_pow2_roundup(len);
|
|
||||||
if ((buf->data = malloc(buf->size)) == NULL) {
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
|
||||||
"unable to malloc %u", buf->size);
|
|
||||||
buf->size = 0;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
|
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
|
||||||
"size + server message %zu bytes", len);
|
"size + server message %zu bytes", len);
|
||||||
|
|
||||||
|
if ((buf = get_free_buf(len, closure)) == NULL) {
|
||||||
|
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||||
|
"unable to allocate connection_buffer");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
memcpy(buf->data, &msg_len, sizeof(msg_len));
|
memcpy(buf->data, &msg_len, sizeof(msg_len));
|
||||||
server_message__pack(msg, buf->data + sizeof(msg_len));
|
server_message__pack(msg, buf->data + sizeof(msg_len));
|
||||||
buf->len = len;
|
buf->len = len;
|
||||||
|
@ -159,7 +159,7 @@ void connection_closure_free(struct connection_closure *closure);
|
|||||||
bool schedule_commit_point(TimeSpec *commit_point, struct connection_closure *closure);
|
bool schedule_commit_point(TimeSpec *commit_point, struct connection_closure *closure);
|
||||||
bool fmt_log_id_message(const char *id, struct connection_closure *closure);
|
bool fmt_log_id_message(const char *id, struct connection_closure *closure);
|
||||||
bool fmt_error_message(const char *errstr, struct connection_closure *closure);
|
bool fmt_error_message(const char *errstr, struct connection_closure *closure);
|
||||||
struct connection_buffer *get_free_buf(struct connection_closure *closure);
|
struct connection_buffer *get_free_buf(size_t, struct connection_closure *closure);
|
||||||
|
|
||||||
/* logsrvd_conf.c */
|
/* logsrvd_conf.c */
|
||||||
bool logsrvd_conf_read(const char *path);
|
bool logsrvd_conf_read(const char *path);
|
||||||
|
@ -148,18 +148,12 @@ static bool
|
|||||||
fmt_client_message(struct connection_closure *closure, ClientMessage *msg)
|
fmt_client_message(struct connection_closure *closure, ClientMessage *msg)
|
||||||
{
|
{
|
||||||
struct relay_closure *relay_closure = closure->relay_closure;
|
struct relay_closure *relay_closure = closure->relay_closure;
|
||||||
struct connection_buffer *buf;
|
struct connection_buffer *buf = NULL;
|
||||||
uint32_t msg_len;
|
uint32_t msg_len;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
size_t len;
|
size_t len;
|
||||||
debug_decl(fmt_client_message, SUDO_DEBUG_UTIL);
|
debug_decl(fmt_client_message, SUDO_DEBUG_UTIL);
|
||||||
|
|
||||||
if ((buf = get_free_buf(closure)) == NULL) {
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
|
||||||
"unable to allocate connection_buffer");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = client_message__get_packed_size(msg);
|
len = client_message__get_packed_size(msg);
|
||||||
if (len > MESSAGE_SIZE_MAX) {
|
if (len > MESSAGE_SIZE_MAX) {
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||||
@ -171,20 +165,14 @@ fmt_client_message(struct connection_closure *closure, ClientMessage *msg)
|
|||||||
msg_len = htonl((uint32_t)len);
|
msg_len = htonl((uint32_t)len);
|
||||||
len += sizeof(msg_len);
|
len += sizeof(msg_len);
|
||||||
|
|
||||||
/* Resize buffer as needed. */
|
|
||||||
if (len > buf->size) {
|
|
||||||
free(buf->data);
|
|
||||||
buf->size = sudo_pow2_roundup(len);
|
|
||||||
if ((buf->data = malloc(buf->size)) == NULL) {
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
|
||||||
"unable to malloc %u", buf->size);
|
|
||||||
buf->size = 0;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
|
sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
|
||||||
"size + client message %zu bytes", len);
|
"size + client message %zu bytes", len);
|
||||||
|
|
||||||
|
if ((buf = get_free_buf(len, closure)) == NULL) {
|
||||||
|
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||||
|
"unable to allocate connection_buffer");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
memcpy(buf->data, &msg_len, sizeof(msg_len));
|
memcpy(buf->data, &msg_len, sizeof(msg_len));
|
||||||
client_message__pack(msg, buf->data + sizeof(msg_len));
|
client_message__pack(msg, buf->data + sizeof(msg_len));
|
||||||
buf->len = len;
|
buf->len = len;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user