Skip to content

Commit b1cae74

Browse files
ing-eokingjhpark816
authored andcommitted
INTERNAL: Fix the wrong write_and_free error handling in binary protocol
1 parent 5561596 commit b1cae74

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

memcached.c

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4053,8 +4053,13 @@ static void process_bin_stat(conn *c)
40534053
switch (ret) {
40544054
case ENGINE_SUCCESS:
40554055
append_bin_stats(NULL, 0, NULL, 0, c);
4056-
write_and_free(c, c->dynamic_buffer.buffer, c->dynamic_buffer.offset);
4057-
c->dynamic_buffer.buffer = NULL;
4056+
if (c->dynamic_buffer.buffer != NULL) {
4057+
write_and_free(c, c->dynamic_buffer.buffer,
4058+
c->dynamic_buffer.offset);
4059+
c->dynamic_buffer.buffer = NULL;
4060+
} else {
4061+
write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0);
4062+
}
40584063
break;
40594064
case ENGINE_ENOMEM:
40604065
write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0);
@@ -6703,8 +6708,13 @@ static void process_bin_unknown_packet(conn *c)
67036708

67046709
switch (ret) {
67056710
case ENGINE_SUCCESS:
6706-
write_and_free(c, c->dynamic_buffer.buffer, c->dynamic_buffer.offset);
6707-
c->dynamic_buffer.buffer = NULL;
6711+
if (c->dynamic_buffer.buffer != NULL) {
6712+
write_and_free(c, c->dynamic_buffer.buffer,
6713+
c->dynamic_buffer.offset);
6714+
c->dynamic_buffer.buffer = NULL;
6715+
} else {
6716+
write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ENOMEM, 0);
6717+
}
67086718
break;
67096719
case ENGINE_ENOTSUP:
67106720
write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, 0);
@@ -7656,15 +7666,12 @@ print_invalid_command(conn *c, token_t *tokens, const size_t ntokens)
76567666
/* set up a connection to write a buffer then free it, used for stats */
76577667
static void write_and_free(conn *c, char *buf, int bytes)
76587668
{
7659-
if (buf) {
7660-
c->write_and_free = buf;
7661-
c->wcurr = buf;
7662-
c->wbytes = bytes;
7663-
conn_set_state(c, conn_write);
7664-
c->write_and_go = conn_new_cmd;
7665-
} else {
7666-
out_string(c, "SERVER_ERROR out of memory writing stats");
7667-
}
7669+
assert(buf != NULL);
7670+
c->write_and_free = buf;
7671+
c->wcurr = buf;
7672+
c->wbytes = bytes;
7673+
conn_set_state(c, conn_write);
7674+
c->write_and_go = conn_new_cmd;
76687675
}
76697676

76707677
#ifdef JHPARK_OLD_SMGET_INTERFACE
@@ -7866,7 +7873,11 @@ static void process_stats_cachedump(conn *c, token_t *tokens, const size_t ntoke
78667873

78677874
buf = mc_engine.v1->cachedump(mc_engine.v0, c, id, limit,
78687875
forward, sticky, &bytes);
7869-
write_and_free(c, buf, bytes);
7876+
if (buf != NULL) {
7877+
write_and_free(c, buf, bytes);
7878+
} else {
7879+
out_string(c, "SERVER_ERROR out of memory writing stats");
7880+
}
78707881
}
78717882

78727883
static void aggregate_callback(void *in, void *out)
@@ -8279,8 +8290,12 @@ static void process_stats_command(conn *c, token_t *tokens, const size_t ntokens
82798290
switch (ret) {
82808291
case ENGINE_SUCCESS:
82818292
append_ascii_stats(NULL, 0, NULL, 0, c);
8282-
write_and_free(c, c->dynamic_buffer.buffer, c->dynamic_buffer.offset);
8283-
c->dynamic_buffer.buffer = NULL;
8293+
if (c->dynamic_buffer.buffer != NULL) {
8294+
write_and_free(c, c->dynamic_buffer.buffer, c->dynamic_buffer.offset);
8295+
c->dynamic_buffer.buffer = NULL;
8296+
} else {
8297+
out_string(c, "SERVER_ERROR out of memory writing stats");
8298+
}
82848299
break;
82858300
case ENGINE_ENOMEM:
82868301
out_string(c, "SERVER_ERROR out of memory writing stats");

0 commit comments

Comments
 (0)