diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2014-05-25 23:42:42 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2014-05-25 23:42:42 +0300 |
| commit | 66cf9b0675fd18b34983fbbf0fa9313825d0a31a (patch) | |
| tree | dab151da0be7072f36b4543fd955fb10a822f18f | |
| parent | 32be9f607599815028c82d8cf18e8190318e5b2a (diff) | |
| download | libuvh-66cf9b0675fd18b34983fbbf0fa9313825d0a31a.tar.gz libuvh-66cf9b0675fd18b34983fbbf0fa9313825d0a31a.zip | |
fix some memory leaks
| -rw-r--r-- | src/uvh.c | 44 | ||||
| -rw-r--r-- | src/uvh.h | 2 |
2 files changed, 37 insertions, 9 deletions
@@ -130,6 +130,13 @@ error: return NULL; } +void uvh_server_free(struct uvh_server *server) +{ + struct uvh_server_private *p = container_of(server, + struct uvh_server_private, server); + free(p); +} + int uvh_server_listen(struct uvh_server *server, const char *address, short port) { @@ -362,6 +369,10 @@ static void close_cb(uv_handle_t *handle) sdsfree((sds) p->req.url.fragment); sdsfree((sds) p->req.url.userinfo); sdsfree((sds) p->req.content); + sdsfree((sds) p->send_body); + sdsfree((sds) p->send_headers); + + free(p); } static int on_message_begin(http_parser *parser) @@ -540,14 +551,19 @@ struct uvh_write_request struct uvh_request_private *req; }; +static void uvh_write_request_free(struct uvh_write_request *req) +{ + sdsfree((sds) req->buf.base); + free(req); +} + static void after_request_write(uv_write_t *req, int status) { LOG_DEBUG("%s", __FUNCTION__); struct uvh_write_request *wreq = container_of(req, struct uvh_write_request, wreq); (void) status; - sdsfree((sds) wreq->buf.base); - free(wreq); + uvh_write_request_free(wreq); } static void uvh_request_write_sds(struct uvh_request *req, sds data, @@ -682,6 +698,8 @@ void uvh_request_end(struct uvh_request *req) if (!p->streaming) uvh_request_write_sds(req, p->send_body, &after_request_write); + else + sdsfree(p->send_body); if (p->keepalive && !p->streaming) { @@ -699,6 +717,8 @@ static void after_last_chunk_write(uv_write_t *req, int status) (void)status; request_init(wreq->req, wreq->req->req.server); + + uvh_write_request_free(wreq); } static void after_chunk_write(uv_write_t *req, int status) @@ -712,6 +732,8 @@ static void after_chunk_write(uv_write_t *req, int status) struct uvh_request_private *p = wreq->req; + uvh_write_request_free(wreq); + if (p->stream_cb) { char *chunk; @@ -720,7 +742,7 @@ static void after_chunk_write(uv_write_t *req, int status) if (chunklen == 0) { - uvh_request_write_chunk(&p->req, sdsempty()); + uvh_request_write_chunk(&p->req, NULL); } else { @@ -732,22 +754,26 @@ static void after_chunk_write(uv_write_t *req, int status) static void uvh_request_write_chunk(struct uvh_request *req, sds chunk) { - LOG_DEBUG("%s len:%d", __FUNCTION__, (int) sdslen(chunk)); + unsigned int len = chunk != NULL ? sdslen(chunk) : 0; + + LOG_DEBUG("%s len:%u", __FUNCTION__, len); - sds chunklen = sdscatprintf(sdsempty(), "%X\r\n", - (unsigned int) sdslen(chunk)); + sds chunklen = sdscatprintf(sdsempty(), "%X\r\n", len); - uvh_request_write_sds(req, chunklen, NULL); + uvh_request_write_sds(req, chunklen, &after_request_write); uv_write_cb callback; - if (sdslen(chunk) > 0) + if (len > 0) { - uvh_request_write_sds(req, chunk, NULL); + uvh_request_write_sds(req, chunk, &after_request_write); callback = &after_chunk_write; } else { + if (chunk) + sdsfree(chunk); + callback = &after_last_chunk_write; } @@ -103,6 +103,8 @@ struct uvh_request struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data, uvh_request_handler_cb request_handler); +void uvh_server_free(struct uvh_server *server); + int uvh_server_listen(struct uvh_server *server, const char *address, short port); |
