summaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
authorjudeng <abc3844@126.com>2023-04-16 20:49:26 +0800
committerGitHub <noreply@github.com>2023-04-16 15:49:26 +0300
commite7f18432b8e9e1d1998d3a898006497e6c5e5a32 (patch)
treee168db166288fed2477e543056587b859d5a32fa /src/server.c
parent1222b6087385aa431a412a9e9b59cf29ce55210e (diff)
downloadredis-e7f18432b8e9e1d1998d3a898006497e6c5e5a32.tar.gz
avoid incorrect shrinking of querybuf when client is reading a big argv (#12000)
this pr fix two wrongs: 1. When client’s querybuf is pre-allocated for a fat argv, we need to update the querybuf_peak of the client immediately to completely avoid the unexpected shrinking of querybuf in the next clientCron (before data arrives to set the peak). 2. the protocol's bulklen does not include `\r\n`, but the allocation and the data we read does. so in `clientsCronResizeQueryBuffer`, the `resize` or `querybuf_peak` should add these 2 bytes. the first bug is likely to hit us on large payloads over slow connections, in which case transferring the payload can take longer and a cron event will be triggered (specifically if there are not a lot of clients)
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/src/server.c b/src/server.c
index 059e4c702..1a9312df0 100644
--- a/src/server.c
+++ b/src/server.c
@@ -744,7 +744,7 @@ int clientsCronResizeQueryBuffer(client *c) {
* sure not to resize to less than the bulk length. */
size_t resize = sdslen(c->querybuf);
if (resize < c->querybuf_peak) resize = c->querybuf_peak;
- if (c->bulklen != -1 && resize < (size_t)c->bulklen) resize = c->bulklen;
+ if (c->bulklen != -1 && resize < (size_t)c->bulklen + 2) resize = c->bulklen + 2;
c->querybuf = sdsResize(c->querybuf, resize, 1);
}
}
@@ -754,8 +754,7 @@ int clientsCronResizeQueryBuffer(client *c) {
c->querybuf_peak = sdslen(c->querybuf);
/* We reset to either the current used, or currently processed bulk size,
* which ever is bigger. */
- if (c->bulklen != -1 && (size_t)c->bulklen > c->querybuf_peak)
- c->querybuf_peak = c->bulklen;
+ if (c->bulklen != -1 && (size_t)c->bulklen + 2 > c->querybuf_peak) c->querybuf_peak = c->bulklen + 2;
return 0;
}