X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/4dd444bb4aabc3d6be68f90b67ad8a3a185fd40b..13cd1515f9030ed4f8ebd0b54fa90243858e244b:/src/networking.c diff --git a/src/networking.c b/src/networking.c index 629267d1..f14b4ef8 100644 --- a/src/networking.c +++ b/src/networking.c @@ -610,7 +610,7 @@ void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) { } } if (totwritten > 0) c->lastinteraction = time(NULL); - if (listLength(c->reply) == 0) { + if (c->bufpos == 0 && listLength(c->reply) == 0) { c->sentlen = 0; aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE); @@ -703,7 +703,7 @@ int processMultibulkBuffer(redisClient *c) { if (c->multibulklen == 0) { /* The client should have been reset */ - redisAssert(c->argc == 0); + redisAssertWithInfo(c,NULL,c->argc == 0); /* Multi bulk length cannot be read without a \r\n */ newline = strchr(c->querybuf,'\r'); @@ -716,7 +716,7 @@ int processMultibulkBuffer(redisClient *c) { /* We know for sure there is a whole line since newline != NULL, * so go ahead and find out the multi bulk length. */ - redisAssert(c->querybuf[0] == '*'); + redisAssertWithInfo(c,NULL,c->querybuf[0] == '*'); ok = string2ll(c->querybuf+1,newline-(c->querybuf+1),&ll); if (!ok || ll > 1024*1024) { addReplyError(c,"Protocol error: invalid multibulk length"); @@ -737,7 +737,7 @@ int processMultibulkBuffer(redisClient *c) { c->argv = zmalloc(sizeof(robj*)*c->multibulklen); } - redisAssert(c->multibulklen > 0); + redisAssertWithInfo(c,NULL,c->multibulklen > 0); while(c->multibulklen) { /* Read bulk length if unknown */ if (c->bulklen == -1) { @@ -793,6 +793,9 @@ int processMultibulkBuffer(redisClient *c) { void processInputBuffer(redisClient *c) { /* Keep processing while there is something in the input buffer */ while(sdslen(c->querybuf)) { + /* Immediately abort if the client is in the middle of something. */ + if (c->flags & REDIS_BLOCKED) return; + /* REDIS_CLOSE_AFTER_REPLY closes the connection once the reply is * written to the client. Make sure to not let the reply grow after * this flag has been set (i.e. don't process more commands). */ @@ -967,7 +970,7 @@ void rewriteClientCommandVector(redisClient *c, int argc, ...) { c->argv = argv; c->argc = argc; c->cmd = lookupCommand(c->argv[0]->ptr); - redisAssert(c->cmd != NULL); + redisAssertWithInfo(c,NULL,c->cmd != NULL); va_end(ap); } @@ -976,7 +979,7 @@ void rewriteClientCommandVector(redisClient *c, int argc, ...) { void rewriteClientCommandArgument(redisClient *c, int i, robj *newval) { robj *oldval; - redisAssert(i < c->argc); + redisAssertWithInfo(c,NULL,i < c->argc); oldval = c->argv[i]; c->argv[i] = newval; incrRefCount(newval); @@ -985,6 +988,6 @@ void rewriteClientCommandArgument(redisClient *c, int i, robj *newval) { /* If this is the command name make sure to fix c->cmd. */ if (i == 0) { c->cmd = lookupCommand(c->argv[0]->ptr); - redisAssert(c->cmd != NULL); + redisAssertWithInfo(c,NULL,c->cmd != NULL); } }