Fix bug where the client is not present in server.clients when free'ing it
When creating the readable event results in an error (this happens when the server hits OS limits), the client was not added to the list of clients when freeClient was called. This results in an assertion error. It is better to check this condition first and free the client immediately when this condition occurs. Port of 00a90feb.
This commit is contained in:
parent
7bc696cb03
commit
3e799b46cf
@ -17,6 +17,14 @@ redisClient *createClient(int fd) {
|
|||||||
anetNonBlock(NULL,fd);
|
anetNonBlock(NULL,fd);
|
||||||
anetTcpNoDelay(NULL,fd);
|
anetTcpNoDelay(NULL,fd);
|
||||||
if (!c) return NULL;
|
if (!c) return NULL;
|
||||||
|
if (aeCreateFileEvent(server.el,fd,AE_READABLE,
|
||||||
|
readQueryFromClient, c) == AE_ERR)
|
||||||
|
{
|
||||||
|
close(fd);
|
||||||
|
zfree(c);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
selectDb(c,0);
|
selectDb(c,0);
|
||||||
c->fd = fd;
|
c->fd = fd;
|
||||||
c->querybuf = sdsempty();
|
c->querybuf = sdsempty();
|
||||||
@ -43,11 +51,6 @@ redisClient *createClient(int fd) {
|
|||||||
c->pubsub_patterns = listCreate();
|
c->pubsub_patterns = listCreate();
|
||||||
listSetFreeMethod(c->pubsub_patterns,decrRefCount);
|
listSetFreeMethod(c->pubsub_patterns,decrRefCount);
|
||||||
listSetMatchMethod(c->pubsub_patterns,listMatchObjects);
|
listSetMatchMethod(c->pubsub_patterns,listMatchObjects);
|
||||||
if (aeCreateFileEvent(server.el, c->fd, AE_READABLE,
|
|
||||||
readQueryFromClient, c) == AE_ERR) {
|
|
||||||
freeClient(c);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
listAddNodeTail(server.clients,c);
|
listAddNodeTail(server.clients,c);
|
||||||
initClientMultiState(c);
|
initClientMultiState(c);
|
||||||
return c;
|
return c;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user