Commit 1fb8628861c0415833f99c9d4de8c890f4a8707f
1 parent
142319ae
fix memory leak introduced when https was added as well as a bug in request line parsing
Showing
5 changed files
with
36 additions
and
38 deletions
| ... | ... | @@ -19,8 +19,8 @@ httpParserRequestVars(HttpParser this) |
| 19 | 19 | } |
| 20 | 20 | |
| 21 | 21 | request->path = malloc(delim - request->uri + 1); |
| 22 | - request->path[delim - request->uri + 1] = 0; | |
| 23 | - memcpy(request->path, request->uri, delim - request->uri + 1); | |
| 22 | + request->path[delim - request->uri] = 0; | |
| 23 | + memcpy(request->path, request->uri, delim - request->uri); | |
| 24 | 24 | |
| 25 | 25 | while(NULL != delim && 0 != *delim) { |
| 26 | 26 | char * key = delim + 1; | ... | ... |
| ... | ... | @@ -35,6 +35,10 @@ |
| 35 | 35 | |
| 36 | 36 | #include "utils/memory.h" |
| 37 | 37 | |
| 38 | + | |
| 39 | +void serverCloseConn(Server, unsigned int); | |
| 40 | + | |
| 41 | + | |
| 38 | 42 | static |
| 39 | 43 | int |
| 40 | 44 | serverCtor(void * _this, va_list * params) |
| ... | ... | @@ -102,18 +106,9 @@ serverDtor(void * _this) |
| 102 | 106 | int i; |
| 103 | 107 | |
| 104 | 108 | for (i=0; i<this->nfds; i++) { |
| 105 | - if (this->sock->handle != (this->fds)[i].fd) { | |
| 106 | - Stream st = (this->conns[(this->fds)[i].fd]).stream; | |
| 107 | - | |
| 108 | - delete((this->conns[(this->fds)[i].fd]).sock); | |
| 109 | - delete((this->conns[(this->fds)[i].fd]).worker); | |
| 110 | - | |
| 111 | - if (NULL != st && STREAM_SSL == st->type) { | |
| 112 | - SSL_shutdown((st->handle).ssl); | |
| 113 | - SSL_free((st->handle).ssl); | |
| 114 | - } | |
| 115 | - | |
| 116 | - delete((this->conns[(this->fds)[i].fd]).stream); | |
| 109 | + if (this->sock->handle != (this->fds)[i].fd && | |
| 110 | + this->sockSSL->handle != (this->fds)[i].fd) { | |
| 111 | + serverCloseConn(this, i); | |
| 117 | 112 | } |
| 118 | 113 | } |
| 119 | 114 | |
| ... | ... | @@ -122,6 +117,7 @@ serverDtor(void * _this) |
| 122 | 117 | |
| 123 | 118 | delete(this->sock); |
| 124 | 119 | delete(this->sockSSL); |
| 120 | + | |
| 125 | 121 | SSL_CTX_free(this->ctx); |
| 126 | 122 | ERR_free_strings(); |
| 127 | 123 | } | ... | ... |
| ... | ... | @@ -31,16 +31,17 @@ void |
| 31 | 31 | serverCloseConn(Server this, unsigned int i) |
| 32 | 32 | { |
| 33 | 33 | int fd = (this->fds)[i].fd; |
| 34 | - Stream st = (this->conns[(this->fds)[i].fd]).stream; | |
| 34 | + Stream st = (this->conns[fd]).stream; | |
| 35 | 35 | |
| 36 | 36 | delete((this->conns)[fd].sock); |
| 37 | 37 | delete((this->conns)[fd].worker); |
| 38 | 38 | |
| 39 | 39 | if (NULL != st && STREAM_SSL == st->type) { |
| 40 | 40 | SSL_shutdown((st->handle).ssl); |
| 41 | + SSL_free((st->handle).ssl); | |
| 41 | 42 | } |
| 42 | 43 | |
| 43 | - delete((this->conns)[fd].stream); | |
| 44 | + delete(st); | |
| 44 | 45 | |
| 45 | 46 | memset(&(this->fds[i]), 0, sizeof(struct pollfd)); |
| 46 | 47 | } | ... | ... |
| ... | ... | @@ -36,36 +36,36 @@ int |
| 36 | 36 | serverHandleAccept(Server this, unsigned int i) |
| 37 | 37 | { |
| 38 | 38 | char remoteAddr[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; |
| 39 | - Sock acc = NULL; | |
| 39 | + Sock acc = NULL; | |
| 40 | 40 | Stream st; |
| 41 | 41 | |
| 42 | 42 | if (this->nfds >= this->max_fds) { |
| 43 | 43 | return -1; |
| 44 | 44 | } |
| 45 | 45 | |
| 46 | - switch(i) { | |
| 47 | - case 0: | |
| 48 | - // no SSL | |
| 49 | - acc = socketAccept(this->sock, &remoteAddr); | |
| 50 | - st = new(Stream, STREAM_FD, acc->handle); | |
| 51 | - break; | |
| 52 | - | |
| 53 | - case 1: | |
| 54 | - // SSL | |
| 55 | - { | |
| 56 | - SSL * ssl = SSL_new(this->ctx); | |
| 57 | - acc = socketAccept(this->sockSSL, &remoteAddr); | |
| 58 | - SSL_set_fd(ssl, acc->handle); | |
| 59 | - SSL_accept(ssl); | |
| 60 | - st = new(Stream, STREAM_SSL, ssl); | |
| 61 | - } | |
| 62 | - break; | |
| 63 | - | |
| 64 | - default: | |
| 65 | - break; | |
| 66 | - } | |
| 46 | + acc = socketAccept((0 == i)? this->sock : this->sockSSL, &remoteAddr); | |
| 67 | 47 | |
| 68 | 48 | if (-1 != acc->handle) { |
| 49 | + switch(i) { | |
| 50 | + case 0: | |
| 51 | + // no SSL | |
| 52 | + st = new(Stream, STREAM_FD, acc->handle); | |
| 53 | + break; | |
| 54 | + | |
| 55 | + case 1: | |
| 56 | + // SSL | |
| 57 | + { | |
| 58 | + SSL * ssl = SSL_new(this->ctx); | |
| 59 | + SSL_set_fd(ssl, acc->handle); | |
| 60 | + SSL_accept(ssl); | |
| 61 | + st = new(Stream, STREAM_SSL, ssl); | |
| 62 | + } | |
| 63 | + break; | |
| 64 | + | |
| 65 | + default: | |
| 66 | + break; | |
| 67 | + } | |
| 68 | + | |
| 69 | 69 | // save the socket handle |
| 70 | 70 | (this->conns)[acc->handle].sock = acc; |
| 71 | 71 | ... | ... |
Please
register
or
login
to post a comment