From 9378544d1942930d8fc70a705bcea7be58125c6f Mon Sep 17 00:00:00 2001 From: Nicolas Favre-Felix Date: Wed, 26 Jan 2011 21:40:13 +0100 Subject: [PATCH] Fix subscribe leak. --- client.c | 6 +++--- cmd.c | 8 +------- formats/common.c | 2 +- http.c | 2 +- server.c | 12 ++++++++++++ server.h | 3 +++ 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/client.c b/client.c index 03e573a..a86fc48 100644 --- a/client.c +++ b/client.c @@ -77,7 +77,7 @@ http_client_read(int fd, short event, void *ctx) { http_client_free(c); break; - default: + default: /* CLIENT_EXECUTING */ break; } } @@ -129,8 +129,8 @@ http_client_free(struct http_client *c) { close(c->fd); if(c->sub) { - /* clean up redis object */ - redisAsyncFree(c->sub->s->ac); + /* clean up Redis connection */ + server_free(c->sub->s); /* clean up command object */ if(c->sub->cmd) { diff --git a/cmd.c b/cmd.c index f2b99c1..c65ed62 100644 --- a/cmd.c +++ b/cmd.c @@ -240,13 +240,7 @@ cmd_select_format(struct http_client *client, struct cmd *cmd, int cmd_is_subscribe(struct cmd *cmd) { - /* - if(cmd->started_responding) { - return 1; - } - */ - - if(cmd->count >= 1 && + if(cmd->count >= 1 && (strncasecmp(cmd->argv[0], "SUBSCRIBE", cmd->argv_len[0]) == 0 || strncasecmp(cmd->argv[0], "PSUBSCRIBE", cmd->argv_len[0]) == 0)) { return 1; diff --git a/formats/common.c b/formats/common.c index 64062bd..b673e31 100644 --- a/formats/common.c +++ b/formats/common.c @@ -22,7 +22,7 @@ char *etag_new(const char *p, size_t sz) { for(i = 0; i < 16; ++i) { sprintf(etag + 1 + 2*i, "%.2x", (unsigned char)buf[i]); } - + etag[0] = '"'; etag[33] = '"'; diff --git a/http.c b/http.c index 6fd9c3a..025a20d 100644 --- a/http.c +++ b/http.c @@ -88,7 +88,7 @@ http_response_write(struct http_response *r, int fd) { p += r->headers[i].sz; sz += r->headers[i].sz; } - + /* end of headers */ s = realloc(s, sz + 2); memcpy(s + sz, "\r\n", 2); diff --git a/server.c b/server.c index 31e9070..096d033 100644 --- a/server.c +++ b/server.c @@ -84,6 +84,18 @@ server_new(const char *filename) { return s; } +void +server_free(struct server *s) { + + /* cleanup Redis async object, _before_ the 2 struct event. */ + redisAsyncFree(s->ac); + + event_del(&s->ev); + event_del(&s->ev_reconnect); + + free(s); +} + static void connectCallback(const redisAsyncContext *c) { ((void)c); diff --git a/server.h b/server.h index e015f16..31e527a 100644 --- a/server.h +++ b/server.h @@ -26,6 +26,9 @@ webdis_connect(struct server *s); struct server * server_new(const char *filename); +void +server_free(struct server *s); + struct server * server_copy(const struct server *s);