@@ -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 */
76577667static 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
78727883static 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