[Libevent-users] fixes for mem leaks etc

Niels Provos provos at citi.umich.edu
Fri Jan 26 23:05:29 EST 2007


Hi Phil,

the C++ extern change is made.  I also asserted activeq in event.c.
The tailq related changes are unnecessary.  If Coverity flagged them
then they are false positives.

Thanks for the patches,

Niels.

On 1/25/07, Phil Oleson <oz at nixil.net> wrote:
> Index: evdns.h
> ===================================================================
> --- evdns.h     (revision 312)
> +++ evdns.h     (working copy)
> @@ -237,6 +237,10 @@
>  #ifndef EVENTDNS_H
>  #define EVENTDNS_H
>
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
>  /* Error codes 0-5 are as described in RFC 1035. */
>  #define DNS_ERR_NONE 0
>  /* The name server was unable to interpret the query */
> @@ -303,4 +307,8 @@
>
>  #define DNS_NO_SEARCH 1
>
> +#ifdef __cplusplus
> +}
> +#endif
> +
>  #endif  // !EVENTDNS_H
>
>
> Index: event.c
> ===================================================================
> --- event.c     (revision 312)
> +++ event.c     (working copy)
> @@ -301,6 +301,8 @@
>                 }
>         }
>
> +       if (!activeq) return;
> +
>         for (ev = TAILQ_FIRST(activeq); ev; ev = TAILQ_FIRST(activeq)) {
>                 event_queue_remove(base, ev, EVLIST_ACTIVE);
>
>
>
> Index: evrpc.c
> ===================================================================
> --- evrpc.c     (revision 312)
> +++ evrpc.c     (working copy)
> @@ -260,19 +260,25 @@
>  void
>  evrpc_pool_free(struct evrpc_pool *pool)
>  {
> -       struct evhttp_connection *connection;
> -       struct evrpc_request_wrapper *request;
> +       struct evhttp_connection *connection, *conn_next;
> +       struct evrpc_request_wrapper *request, *req_next;
>
> -       while ((request = TAILQ_FIRST(&pool->requests)) != NULL) {
> -               TAILQ_REMOVE(&pool->requests, request, next);
> +       request = TAILQ_FIRST(&pool->requests);
> +       while (request != NULL) {
> +               req_next = TAILQ_NEXT(request, next);
>                 /* if this gets more complicated we need our own function */
>                 evrpc_request_wrapper_free(request);
> +               request = req_next;
>         }
> +       TAILQ_INIT(&pool->requests);
>
> -       while ((connection = TAILQ_FIRST(&pool->connections)) != NULL) {
> -               TAILQ_REMOVE(&pool->connections, connection, next);
> +       connection = TAILQ_FIRST(&pool->connections);
> +       while (connection != NULL) {
> +               conn_next = TAILQ_NEXT(connection, next);
>                 evhttp_connection_free(connection);
> +               connection = conn_next;
>         }
> +       TAILQ_INIT(&pool->connections);
>
>         free(pool);
>  }
>
>
> Index: http.c
> ===================================================================
> --- http.c      (revision 312)
> +++ http.c      (working copy)
> @@ -715,7 +715,7 @@
>  void
>  evhttp_connection_free(struct evhttp_connection *evcon)
>  {
> -       struct evhttp_request *req;
> +       struct evhttp_request *req, *next_req;
>
>         /* notify interested parties that this connection is going down */
>         if (evcon->fd != -1) {
> @@ -724,10 +724,13 @@
>         }
>
>         /* remove all requests that might be queued on this connection */
> -       while ((req = TAILQ_FIRST(&evcon->requests)) != NULL) {
> -               TAILQ_REMOVE(&evcon->requests, req, next);
> +       req = TAILQ_FIRST(&evcon->requests);
> +       while (req != NULL) {
> +               next_req = TAILQ_NEXT(req, next);
>                 evhttp_request_free(req);
> +               req = next_req;
>         }
> +       TAILQ_INIT(&evcon->requests);
>
>         if (evcon->http_server != NULL) {
>                 struct evhttp *http = evcon->http_server;
> @@ -1021,16 +1024,17 @@
>  void
>  evhttp_clear_headers(struct evkeyvalq *headers)
>  {
> -       struct evkeyval *header;
> +       struct evkeyval *header, *next_head;
>
> -       for (header = TAILQ_FIRST(headers);
> -           header != NULL;
> -           header = TAILQ_FIRST(headers)) {
> -               TAILQ_REMOVE(headers, header, next);
> +       header = TAILQ_FIRST(headers);
> +       while (header != NULL) {
> +               next_head = TAILQ_NEXT(header, next);
>                 free(header->key);
>                 free(header->value);
>                 free(header);
> +               header = next_head;
>         }
> +       TAILQ_INIT(headers);
>  }
>
>  /*
> @@ -1863,25 +1867,30 @@
>  void
>  evhttp_free(struct evhttp* http)
>  {
> -       struct evhttp_cb *http_cb;
> -       struct evhttp_connection *evcon;
> +       struct evhttp_cb *http_cb, *cb_next;
> +       struct evhttp_connection *evcon, *evcon_next;
>         int fd = http->bind_ev.ev_fd;
>
>         /* Remove the accepting part */
>         event_del(&http->bind_ev);
>         close(fd);
>
> -       while ((evcon = TAILQ_FIRST(&http->connections)) != NULL) {
> -               /* evhttp_connection_free removes the connection */
> -               evhttp_connection_free(evcon);
> +       evcon = TAILQ_FIRST(&http->connections);
> +       while (evcon != NULL) {
> +               evcon_next = TAILQ_NEXT(evcon, next);
> +               evhttp_connection_free(evcon);  /* removes the connection */
> +               evcon = evcon_next;
>         }
>
> -       while ((http_cb = TAILQ_FIRST(&http->callbacks)) != NULL) {
> -               TAILQ_REMOVE(&http->callbacks, http_cb, next);
> +       http_cb = TAILQ_FIRST(&http->callbacks);
> +       while (http_cb != NULL) {
> +               cb_next = TAILQ_NEXT(http_cb, next);
>                 free(http_cb->what);
>                 free(http_cb);
> +               http_cb = cb_next;
>         }
> -
> +       TAILQ_INIT(&http->callbacks);
> +
>         free(http);
>  }
>
>
>
> _______________________________________________
> Libevent-users mailing list
> Libevent-users at monkey.org
> http://monkey.org/mailman/listinfo/libevent-users
>
>
>


More information about the Libevent-users mailing list