From 9f4b1adbea6aa729c767257495dec23635923a3e Mon Sep 17 00:00:00 2001 From: Binbin Date: Sun, 25 Aug 2024 12:03:34 +0800 Subject: [PATCH] Add explicit assert to ensure thread_shared_qb won't expand (#938) Although this won't happen now, adding this statement explicitly. Signed-off-by: Binbin --- src/networking.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/networking.c b/src/networking.c index 27d81da493..ea9a2fe654 100644 --- a/src/networking.c +++ b/src/networking.c @@ -2521,7 +2521,8 @@ void resetClient(client *c) { } } -/* Initializes the shared query buffer to a new sds with the default capacity */ +/* Initializes the shared query buffer to a new sds with the default capacity. + * Need to ensure the initlen is not less than readlen in readToQueryBuf. */ void initSharedQueryBuf(void) { thread_shared_qb = sdsnewlen(NULL, PROTO_IOBUF_LEN); sdsclear(thread_shared_qb); @@ -3119,6 +3120,10 @@ void readToQueryBuf(client *c) { qblen = sdslen(c->querybuf); } + /* c->querybuf may be expanded. If so, the old thread_shared_qb will be released. + * Although we have ensured that c->querybuf will not be expanded in the current + * thread_shared_qb, we still add this check for code robustness. */ + int use_thread_shared_qb = (c->querybuf == thread_shared_qb) ? 1 : 0; if (!is_primary && // primary client's querybuf can grow greedy. (big_arg || sdsalloc(c->querybuf) < PROTO_IOBUF_LEN)) { /* When reading a BIG_ARG we won't be reading more than that one arg @@ -3136,6 +3141,8 @@ void readToQueryBuf(client *c) { /* Read as much as possible from the socket to save read(2) system calls. */ readlen = sdsavail(c->querybuf); } + if (use_thread_shared_qb) serverAssert(c->querybuf == thread_shared_qb); + c->nread = connRead(c->conn, c->querybuf + qblen, readlen); if (c->nread <= 0) { return;