Browse Source

Free redis.c reply object memory leak

Call freeReplyObject() for every redis_get(); libhiredis
freeReplyObject() function does NULL check inside.
pull/225/head
Stefan Mititelu 10 years ago
parent
commit
27ecb3631d
1 changed files with 12 additions and 3 deletions
  1. +12
    -3
      daemon/redis.c

+ 12
- 3
daemon/redis.c View File

@ -896,12 +896,18 @@ static int redis_build_list_cb(GQueue *q, struct redis *r, const char *key, cons
return -1; return -1;
for (i = 0; i < rr->elements; i++) { for (i = 0; i < rr->elements; i++) {
if (rr->element[i]->type != REDIS_REPLY_STRING)
if (rr->element[i]->type != REDIS_REPLY_STRING) {
freeReplyObject(rr);
return -1; return -1;
}
str_init_len(&s, rr->element[i]->str, rr->element[i]->len); str_init_len(&s, rr->element[i]->str, rr->element[i]->len);
if (cb(&s, q, list, ptr))
if (cb(&s, q, list, ptr)) {
freeReplyObject(rr);
return -1; return -1;
}
} }
freeReplyObject(rr);
return 0; return 0;
} }
static int rbl_cb_simple(str *s, GQueue *q, struct redis_list *list, void *ptr) { static int rbl_cb_simple(str *s, GQueue *q, struct redis_list *list, void *ptr) {
@ -1500,7 +1506,7 @@ static void restore_thread(void *call_p, void *ctx_p) {
} }
int redis_restore(struct callmaster *m, struct redis *r) { int redis_restore(struct callmaster *m, struct redis *r) {
redisReply *calls, *call;
redisReply *calls = NULL, *call;
int i, ret = -1; int i, ret = -1;
GThreadPool *gtp; GThreadPool *gtp;
struct thread_ctx ctx; struct thread_ctx ctx;
@ -1546,6 +1552,9 @@ int redis_restore(struct callmaster *m, struct redis *r) {
while ((r = g_queue_pop_head(&ctx.r_q))) while ((r = g_queue_pop_head(&ctx.r_q)))
redis_close(r); redis_close(r);
ret = 0; ret = 0;
freeReplyObject(calls);
err: err:
log_level &= ~LOG_FLAG_RESTORE; log_level &= ~LOG_FLAG_RESTORE;
return ret; return ret;


Loading…
Cancel
Save