diff --git a/src/networking.cpp b/src/networking.cpp index 4f737ec8e..923535bd2 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -839,8 +839,11 @@ void addReplyNullCore(client *c, bool fAsync) { } } -void addReplyNull(client *c) { - addReplyNullCore(c, false); +void addReplyNull(client *c, robj_roptr objOldProtocol) { + if (c->resp < 3 && objOldProtocol != nullptr) + addReply(c, objOldProtocol); + else + addReplyNullCore(c, false); } void addReplyNullAsync(client *c) { @@ -932,7 +935,10 @@ void addReplyBulkSdsAsync(client *c, sds s) { /* Add a C null term string as bulk reply */ void addReplyBulkCStringCore(client *c, const char *s, bool fAsync) { if (s == NULL) { - addReplyNullCore(c,fAsync); + if (c->resp < 3) + addReplyCore(c,shared.nullbulk, fAsync); + else + addReplyNullCore(c,fAsync); } else { addReplyBulkCBufferCore(c,s,strlen(s),fAsync); } @@ -2540,7 +2546,7 @@ NULL if (c->name) addReplyBulk(c,c->name); else - addReplyNull(c); + addReplyNull(c, shared.nullbulk); } else if (!strcasecmp((const char*)ptrFromObj(c->argv[1]),"pause") && c->argc == 3) { long long duration; diff --git a/src/object.cpp b/src/object.cpp index 0ca578de1..de770e47e 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1341,7 +1341,7 @@ NULL } } if ((de = dictFind(c->db->pdict,ptrFromObj(c->argv[2]))) == NULL) { - addReplyNull(c); + addReplyNull(c, shared.nullbulk); return; } size_t usage = objectComputeSize((robj*)dictGetVal(de),samples); diff --git a/src/pubsub.cpp b/src/pubsub.cpp index 61a6dc373..6a9c2bdfc 100644 --- a/src/pubsub.cpp +++ b/src/pubsub.cpp @@ -84,7 +84,7 @@ void addReplyPubsubUnsubscribed(client *c, robj *channel) { if (channel) addReplyBulk(c,channel); else - addReplyNull(c); + addReplyNull(c, shared.nullbulk); addReplyLongLong(c,clientSubscriptionsCount(c)); } @@ -112,7 +112,7 @@ void addReplyPubsubPatUnsubscribed(client *c, robj *pattern) { if (pattern) addReplyBulk(c,pattern); else - addReplyNull(c); + addReplyNull(c, shared.nullbulk); addReplyLongLong(c,clientSubscriptionsCount(c)); } diff --git a/src/server.cpp b/src/server.cpp index af62c78c3..46e4aa9a8 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2174,6 +2174,8 @@ void createSharedObjects(void) { shared.ok = createObject(OBJ_STRING,sdsnew("+OK\r\n")); shared.err = createObject(OBJ_STRING,sdsnew("-ERR\r\n")); shared.emptybulk = createObject(OBJ_STRING,sdsnew("$0\r\n\r\n")); + shared.emptymultibulk = createObject(OBJ_STRING,sdsnew("*0\r\n")); + shared.nullbulk = createObject(OBJ_STRING,sdsnew("$0\r\n\r\n")); shared.czero = createObject(OBJ_STRING,sdsnew(":0\r\n")); shared.cone = createObject(OBJ_STRING,sdsnew(":1\r\n")); shared.emptyarray = createObject(OBJ_STRING,sdsnew("*0\r\n")); diff --git a/src/server.h b/src/server.h index 68fde108e..72c2bf634 100644 --- a/src/server.h +++ b/src/server.h @@ -978,7 +978,7 @@ struct moduleLoadQueueEntry { }; struct sharedObjectsStruct { - robj *crlf, *ok, *err, *emptybulk, *czero, *cone, *pong, *space, + robj *crlf, *ok, *err, *emptybulk, *emptymultibulk, *nullbulk, *czero, *cone, *pong, *space, *colon, *queued, *null[4], *nullarray[4], *emptyarray, *wrongtypeerr, *nokeyerr, *syntaxerr, *sameobjecterr, *outofrangeerr, *noscripterr, *loadingerr, *slowscripterr, *bgsaveerr, @@ -1701,7 +1701,7 @@ void acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask); void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask); void acceptUnixHandler(aeEventLoop *el, int fd, void *privdata, int mask); void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask); -void addReplyNull(client *c); +void addReplyNull(client *c, robj_roptr objOldProtocol = nullptr); void addReplyNullArray(client *c); void addReplyBool(client *c, int b); void addReplyVerbatim(client *c, const char *s, size_t len, const char *ext); diff --git a/src/t_list.cpp b/src/t_list.cpp index b072bf957..ecef14452 100644 --- a/src/t_list.cpp +++ b/src/t_list.cpp @@ -331,7 +331,7 @@ void lindexCommand(client *c) { addReplyBulk(c,value); decrRefCount(value); } else { - addReplyNull(c); + addReplyNull(c,shared.nullbulk); } } else { serverPanic("Unknown list encoding"); @@ -414,7 +414,7 @@ void lrangeCommand(client *c) { /* Invariant: start >= 0, so this test will be true when end < 0. * The range is empty when start > end or start >= length. */ if (start > end || start >= llen) { - addReplyNull(c); + addReplyNull(c,shared.emptymultibulk); return; } if (end >= llen) end = llen-1; diff --git a/src/t_zset.cpp b/src/t_zset.cpp index 2f1032fe2..1c965813d 100644 --- a/src/t_zset.cpp +++ b/src/t_zset.cpp @@ -2439,7 +2439,7 @@ void zrangeGenericCommand(client *c, int reverse) { /* Invariant: start >= 0, so this test will be true when end < 0. * The range is empty when start > end or start >= length. */ if (start > end || start >= llen) { - addReplyNull(c); + addReplyNull(c,shared.emptymultibulk); return; } if (end >= llen) end = llen-1;