diff options
author | stbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2009-08-30 16:15:55 +0000 |
---|---|---|
committer | stbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2009-08-30 16:15:55 +0000 |
commit | be33cfe2c3bcd17a5fdf8dac73312e6fe685510b (patch) | |
tree | 57e1868012272e4d2a98e704d4dc0cc84d18c5b5 | |
parent | f7b07ba94351c032aab814d022b1ca5fd9e3cfde (diff) | |
download | lighttpd-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.c | 2 | ||||
-rw-r--r-- | src/network.c | 59 | ||||
-rw-r--r-- | src/sys-files.c | 1 |
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; } |