Browse Source

fix memory leak introduced when https was added as well as a bug in request line parsing

master
Georg Hopp 14 years ago
parent
commit
1fb8628861
  1. 4
      src/http/parser/request_vars.c
  2. 1
      src/http/request.c
  3. 20
      src/server.c
  4. 5
      src/server/close_conn.c
  5. 6
      src/server/handle_accept.c

4
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;

1
src/http/request.c

@ -75,6 +75,7 @@ httpRequestDtor(void * _this)
FREE(this->uri);
FREE(this->method);
FREE(this->path);
PARENTCALL(_this, Class, dtor);
}

20
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; i<this->nfds; 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();
}

5
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));
}

6
src/server/handle_accept.c

@ -43,10 +43,12 @@ serverHandleAccept(Server this, unsigned int i)
return -1;
}
acc = socketAccept((0 == i)? this->sock : this->sockSSL, &remoteAddr);
if (-1 != acc->handle) {
switch(i) {
case 0:
// no SSL
acc = socketAccept(this->sock, &remoteAddr);
st = new(Stream, STREAM_FD, acc->handle);
break;
@ -54,7 +56,6 @@ serverHandleAccept(Server this, unsigned int i)
// 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);
@ -65,7 +66,6 @@ serverHandleAccept(Server this, unsigned int i)
break;
}
if (-1 != acc->handle) {
// save the socket handle
(this->conns)[acc->handle].sock = acc;

Loading…
Cancel
Save