diff options
author | Henri Doreau <henri.doreau@cea.fr> | 2013-01-22 15:53:17 +0100 |
---|---|---|
committer | Henri Doreau <henri.doreau@cea.fr> | 2013-01-22 15:53:17 +0100 |
commit | d7e3268f48b457cb52336d264f8860b336faea9f (patch) | |
tree | 320b74c5c6125eea5a088ba75d419098ecb50d10 | |
parent | 814be4f5bd62b4f66281879b3035a20ad84bb498 (diff) |
Prevent AsyncConnect from crashing on memory allocation failures.
-rw-r--r-- | async.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -102,7 +102,12 @@ static dictType callbackDict = { }; static redisAsyncContext *redisAsyncInitialize(redisContext *c) { - redisAsyncContext *ac = realloc(c,sizeof(redisAsyncContext)); + redisAsyncContext *ac; + + ac = realloc(c,sizeof(redisAsyncContext)); + if (ac == NULL) + return NULL; + c = &(ac->c); /* The regular connect functions will always set the flag REDIS_CONNECTED. @@ -150,6 +155,11 @@ redisAsyncContext *redisAsyncConnect(const char *ip, int port) { return NULL; ac = redisAsyncInitialize(c); + if (ac == NULL) { + redisFree(c); + return NULL; + } + __redisAsyncCopyError(ac); return ac; } @@ -194,6 +204,9 @@ static int __redisPushCallback(redisCallbackList *list, redisCallback *source) { /* Copy callback from stack to heap */ cb = malloc(sizeof(*cb)); + if (cb == NULL) + return REDIS_ERR_OOM; + if (source != NULL) { memcpy(cb,source,sizeof(*cb)); cb->next = NULL; |