summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9>2009-08-30 16:15:55 +0000
committerstbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9>2009-08-30 16:15:55 +0000
commitbe33cfe2c3bcd17a5fdf8dac73312e6fe685510b (patch)
tree57e1868012272e4d2a98e704d4dc0cc84d18c5b5
parentf7b07ba94351c032aab814d022b1ca5fd9e3cfde (diff)
downloadlighttpd-be33cfe2c3bcd17a5fdf8dac73312e6fe685510b.tar.gz
Fix some mem leaks found by cppcheck
* only the one in sys-files.c is "critical" (and only on windows) git-svn-id: svn://svn.lighttpd.net/lighttpd/trunk@2617 152afb58-edef-0310-8abb-c4023f1b3aa9
-rw-r--r--src/lemon.c2
-rw-r--r--src/network.c59
-rw-r--r--src/sys-files.c1
3 files changed, 36 insertions, 26 deletions
diff --git a/src/lemon.c b/src/lemon.c
index 5484c301..ac37f907 100644
--- a/src/lemon.c
+++ b/src/lemon.c
@@ -2322,6 +2322,7 @@ struct lemon *gp;
if( filebuf==0 ){
ErrorMsg(ps.filename,0,"Can't allocate %d of memory to hold this file.",
filesize+1);
+ fclose(fp);
gp->errorcnt++;
return;
}
@@ -2329,6 +2330,7 @@ struct lemon *gp;
ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.",
filesize);
free(filebuf);
+ fclose(fp);
gp->errorcnt++;
return;
}
diff --git a/src/network.c b/src/network.c
index 72fb0359..1c98c564 100644
--- a/src/network.c
+++ b/src/network.c
@@ -275,7 +275,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (NULL == (sp = strrchr(b->ptr, ':'))) {
log_error_write(srv, __FILE__, __LINE__, "sb", "value of $SERVER[\"socket\"] has to be \"ip:port\".", b);
- return -1;
+ goto error_free_socket;
}
host = b->ptr;
@@ -298,7 +298,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
} else if (port == 0 || port > 65535) {
log_error_write(srv, __FILE__, __LINE__, "sd", "port out of range:", port);
- return -1;
+ goto error_free_socket;
}
if (*host == '\0') host = NULL;
@@ -310,12 +310,12 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (-1 == (srv_socket->sock->fd = socket(srv_socket->addr.plain.sa_family, SOCK_STREAM, 0))) {
log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed:", strerror(errno));
- return -1;
+ goto error_free_socket;
}
#else
log_error_write(srv, __FILE__, __LINE__, "s",
"ERROR: Unix Domain sockets are not supported.");
- return -1;
+ goto error_free_socket;
#endif
}
@@ -325,7 +325,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (-1 == (srv_socket->sock->fd = socket(srv_socket->addr.plain.sa_family, SOCK_STREAM, IPPROTO_TCP))) {
log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed:", strerror(errno));
- return -1;
+ goto error_free_socket;
}
srv_socket->use_ipv6 = 1;
}
@@ -335,14 +335,14 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
srv_socket->addr.plain.sa_family = AF_INET;
if (-1 == (srv_socket->sock->fd = socket(srv_socket->addr.plain.sa_family, SOCK_STREAM, IPPROTO_TCP))) {
log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed:", strerror(errno));
- return -1;
+ goto error_free_socket;
}
}
val = 1;
if (setsockopt(srv_socket->sock->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) {
log_error_write(srv, __FILE__, __LINE__, "ss", "socketsockopt failed:", strerror(errno));
- return -1;
+ goto error_free_socket;
}
switch(srv_socket->addr.plain.sa_family) {
@@ -367,7 +367,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
"sssss", "getaddrinfo failed: ",
gai_strerror(r), "'", host, "'");
- return -1;
+ goto error_free_socket;
}
memcpy(&(srv_socket->addr), res->ai_addr, res->ai_addrlen);
@@ -389,17 +389,17 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
log_error_write(srv, __FILE__, __LINE__,
"sds", "gethostbyname failed: ",
h_errno, host);
- return -1;
+ goto error_free_socket;
}
if (he->h_addrtype != AF_INET) {
log_error_write(srv, __FILE__, __LINE__, "sd", "addr-type != AF_INET: ", he->h_addrtype);
- return -1;
+ goto error_free_socket;
}
if (he->h_length != sizeof(struct in_addr)) {
log_error_write(srv, __FILE__, __LINE__, "sd", "addr-length != sizeof(in_addr): ", he->h_length);
- return -1;
+ goto error_free_socket;
}
memcpy(&(srv_socket->addr.ipv4.sin_addr.s_addr), he->h_addr_list[0], he->h_length);
@@ -430,7 +430,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
host);
- return -1;
+ goto error_free_socket;
}
/* connect failed */
@@ -445,7 +445,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
"testing socket failed:",
host, strerror(errno));
- return -1;
+ goto error_free_socket;
}
break;
@@ -453,7 +453,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
default:
addr_len = 0;
- return -1;
+ goto error_free_socket;
}
if (0 != bind(srv_socket->sock->fd, (struct sockaddr *) &(srv_socket->addr), addr_len)) {
@@ -469,12 +469,12 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
host, port, strerror(errno));
break;
}
- return -1;
+ goto error_free_socket;
}
if (-1 == listen(srv_socket->sock->fd, 128 * 8)) {
log_error_write(srv, __FILE__, __LINE__, "ss", "listen failed: ", strerror(errno));
- return -1;
+ goto error_free_socket;
}
if (s->is_ssl) {
@@ -487,14 +487,14 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (0 == RAND_status()) {
log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
"not enough entropy in the pool");
- return -1;
+ goto error_free_socket;
}
}
if (NULL == (s->ssl_ctx = SSL_CTX_new(SSLv23_server_method()))) {
log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
ERR_error_string(ERR_get_error(), NULL));
- return -1;
+ goto error_free_socket;
}
if (!s->ssl_use_sslv2) {
@@ -502,7 +502,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (SSL_OP_NO_SSLv2 != SSL_CTX_set_options(s->ssl_ctx, SSL_OP_NO_SSLv2)) {
log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
ERR_error_string(ERR_get_error(), NULL));
- return -1;
+ goto error_free_socket;
}
}
@@ -510,33 +510,33 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
if (SSL_CTX_set_cipher_list(s->ssl_ctx, s->ssl_cipher_list->ptr) != 1) {
log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
ERR_error_string(ERR_get_error(), NULL));
- return -1;
+ goto error_free_socket;
}
}
if (buffer_is_empty(s->ssl_pemfile)) {
log_error_write(srv, __FILE__, __LINE__, "s", "ssl.pemfile has to be set");
- return -1;
+ goto error_free_socket;
}
if (!buffer_is_empty(s->ssl_ca_file)) {
if (1 != SSL_CTX_load_verify_locations(s->ssl_ctx, s->ssl_ca_file->ptr, NULL)) {
log_error_write(srv, __FILE__, __LINE__, "ssb", "SSL:",
ERR_error_string(ERR_get_error(), NULL), s->ssl_ca_file);
- return -1;
+ goto error_free_socket;
}
}
if (SSL_CTX_use_certificate_file(s->ssl_ctx, s->ssl_pemfile->ptr, SSL_FILETYPE_PEM) < 0) {
log_error_write(srv, __FILE__, __LINE__, "ssb", "SSL:",
ERR_error_string(ERR_get_error(), NULL), s->ssl_pemfile);
- return -1;
+ goto error_free_socket;
}
if (SSL_CTX_use_PrivateKey_file (s->ssl_ctx, s->ssl_pemfile->ptr, SSL_FILETYPE_PEM) < 0) {
log_error_write(srv, __FILE__, __LINE__, "ssb", "SSL:",
ERR_error_string(ERR_get_error(), NULL), s->ssl_pemfile);
- return -1;
+ goto error_free_socket;
}
if (SSL_CTX_check_private_key(s->ssl_ctx) != 1) {
@@ -544,7 +544,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
"Private key does not match the certificate public key, reason:",
ERR_error_string(ERR_get_error(), NULL),
s->ssl_pemfile);
- return -1;
+ goto error_free_socket;
}
srv_socket->ssl_ctx = s->ssl_ctx;
#else
@@ -557,7 +557,7 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
"ssl requested but openssl support is not compiled in");
- return -1;
+ goto error_free_socket;
#endif
} else {
#ifdef SO_ACCEPTFILTER
@@ -595,6 +595,13 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
buffer_free(b);
return 0;
+
+error_free_socket:
+ iosocket_free(srv_socket->sock);
+ buffer_free(srv_socket->srv_token);
+ free(srv_socket);
+
+ return -1;
}
int network_close(server *srv) {
diff --git a/src/sys-files.c b/src/sys-files.c
index aff27ec9..2a9079a3 100644
--- a/src/sys-files.c
+++ b/src/sys-files.c
@@ -6,6 +6,7 @@ DIR *opendir(const char *dn) {
DIR *d = malloc(sizeof(*d));
if (INVALID_HANDLE_VALUE == (d->h = FindFirstFile(dn, &(d->finddata)))) {
+ free(d);
return NULL;
}