From 1fb8628861c0415833f99c9d4de8c890f4a8707f Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Tue, 20 Mar 2012 14:01:42 +0100 Subject: [PATCH] fix memory leak introduced when https was added as well as a bug in request line parsing --- src/http/parser/request_vars.c | 4 ++-- src/http/request.c | 1 + src/server.c | 20 +++++++--------- src/server/close_conn.c | 5 ++-- src/server/handle_accept.c | 44 +++++++++++++++++----------------- 5 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/http/parser/request_vars.c b/src/http/parser/request_vars.c index 904668a..a524e64 100644 --- a/src/http/parser/request_vars.c +++ b/src/http/parser/request_vars.c @@ -19,8 +19,8 @@ httpParserRequestVars(HttpParser this) } request->path = malloc(delim - request->uri + 1); - request->path[delim - request->uri + 1] = 0; - memcpy(request->path, request->uri, delim - request->uri + 1); + request->path[delim - request->uri] = 0; + memcpy(request->path, request->uri, delim - request->uri); while(NULL != delim && 0 != *delim) { char * key = delim + 1; diff --git a/src/http/request.c b/src/http/request.c index 4347cd4..2304be0 100644 --- a/src/http/request.c +++ b/src/http/request.c @@ -75,6 +75,7 @@ httpRequestDtor(void * _this) FREE(this->uri); FREE(this->method); + FREE(this->path); PARENTCALL(_this, Class, dtor); } diff --git a/src/server.c b/src/server.c index a8e7951..9e77d36 100644 --- a/src/server.c +++ b/src/server.c @@ -35,6 +35,10 @@ #include "utils/memory.h" + +void serverCloseConn(Server, unsigned int); + + static int serverCtor(void * _this, va_list * params) @@ -102,18 +106,9 @@ serverDtor(void * _this) int i; for (i=0; infds; i++) { - if (this->sock->handle != (this->fds)[i].fd) { - Stream st = (this->conns[(this->fds)[i].fd]).stream; - - delete((this->conns[(this->fds)[i].fd]).sock); - delete((this->conns[(this->fds)[i].fd]).worker); - - if (NULL != st && STREAM_SSL == st->type) { - SSL_shutdown((st->handle).ssl); - SSL_free((st->handle).ssl); - } - - delete((this->conns[(this->fds)[i].fd]).stream); + if (this->sock->handle != (this->fds)[i].fd && + this->sockSSL->handle != (this->fds)[i].fd) { + serverCloseConn(this, i); } } @@ -122,6 +117,7 @@ serverDtor(void * _this) delete(this->sock); delete(this->sockSSL); + SSL_CTX_free(this->ctx); ERR_free_strings(); } diff --git a/src/server/close_conn.c b/src/server/close_conn.c index dcab329..1da15fc 100644 --- a/src/server/close_conn.c +++ b/src/server/close_conn.c @@ -31,16 +31,17 @@ void serverCloseConn(Server this, unsigned int i) { int fd = (this->fds)[i].fd; - Stream st = (this->conns[(this->fds)[i].fd]).stream; + Stream st = (this->conns[fd]).stream; delete((this->conns)[fd].sock); delete((this->conns)[fd].worker); if (NULL != st && STREAM_SSL == st->type) { SSL_shutdown((st->handle).ssl); + SSL_free((st->handle).ssl); } - delete((this->conns)[fd].stream); + delete(st); memset(&(this->fds[i]), 0, sizeof(struct pollfd)); } diff --git a/src/server/handle_accept.c b/src/server/handle_accept.c index 8235e30..ce17153 100644 --- a/src/server/handle_accept.c +++ b/src/server/handle_accept.c @@ -36,36 +36,36 @@ int serverHandleAccept(Server this, unsigned int i) { char remoteAddr[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - Sock acc = NULL; + Sock acc = NULL; Stream st; if (this->nfds >= this->max_fds) { return -1; } - switch(i) { - case 0: - // no SSL - acc = socketAccept(this->sock, &remoteAddr); - st = new(Stream, STREAM_FD, acc->handle); - break; - - case 1: - // SSL - { - SSL * ssl = SSL_new(this->ctx); - acc = socketAccept(this->sockSSL, &remoteAddr); - SSL_set_fd(ssl, acc->handle); - SSL_accept(ssl); - st = new(Stream, STREAM_SSL, ssl); - } - break; - - default: - break; - } + acc = socketAccept((0 == i)? this->sock : this->sockSSL, &remoteAddr); if (-1 != acc->handle) { + switch(i) { + case 0: + // no SSL + st = new(Stream, STREAM_FD, acc->handle); + break; + + case 1: + // SSL + { + SSL * ssl = SSL_new(this->ctx); + SSL_set_fd(ssl, acc->handle); + SSL_accept(ssl); + st = new(Stream, STREAM_SSL, ssl); + } + break; + + default: + break; + } + // save the socket handle (this->conns)[acc->handle].sock = acc;