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