Detect and handle more allocation failures.
authorJardel Weyrich <jweyrich@gmail.com>
Sat, 18 Dec 2010 03:07:27 +0000 (01:07 -0200)
committerNick Mathewson <nickm@torproject.org>
Fri, 7 Jan 2011 18:03:31 +0000 (13:03 -0500)
evdns.c
evutil.c
http.c
select.c

diff --git a/evdns.c b/evdns.c
index a1636a14e1a2b9cca29f6ee62ed728155dd3f27e..d085bac8a42c1fc27ceb2d7aaf11c18b8c68afa5 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -3069,6 +3069,10 @@ search_request_new(struct evdns_base *base, struct evdns_request *handle,
                }
                EVUTIL_ASSERT(handle->search_origname == NULL);
                handle->search_origname = mm_strdup(name);
+               if (handle->search_origname == NULL) {
+                       /* XXX Should we dealloc req? If yes, how? */
+                       return NULL;
+               }
                handle->search_state = base->global_search_state;
                handle->search_flags = flags;
                base->global_search_state->refcount++;
index b769acc2b323fa7f90a42074d5bc81af8b395e06..1d2c0fc921fd1ba7ffb8531feb70d3b834a8e061 100644 (file)
--- a/evutil.c
+++ b/evutil.c
@@ -958,8 +958,13 @@ addrinfo_from_hostent(const struct hostent *ent,
                res = evutil_addrinfo_append(res, ai);
        }
 
-       if (res && ((hints->ai_flags & EVUTIL_AI_CANONNAME) && ent->h_name))
+       if (res && ((hints->ai_flags & EVUTIL_AI_CANONNAME) && ent->h_name)) {
                res->ai_canonname = mm_strdup(ent->h_name);
+               if (res->ai_canonname == NULL) {
+                       evutil_freeaddrinfo(res);
+                       return NULL;
+               }
+       }
 
        return res;
 }
diff --git a/http.c b/http.c
index f8de3b37f808e32cf85fd118cb1e40f410e035ca..60ea21ee8292d309b7b7c748fda4ab789eaaa1f1 100644 (file)
--- a/http.c
+++ b/http.c
@@ -2491,6 +2491,10 @@ evhttp_response_code(struct evhttp_request *req, int code, const char *reason)
        if (reason == NULL)
                reason = evhttp_response_phrase_internal(code);
        req->response_code_line = mm_strdup(reason);
+       if (req->response_code_line == NULL) {
+               event_warn("%s: strdup", __func__);
+               /* XXX what else can we do? */
+       }
 }
 
 void
@@ -3280,6 +3284,11 @@ evhttp_set_cb(struct evhttp *http, const char *uri,
        }
 
        http_cb->what = mm_strdup(uri);
+       if (http_cb->what == NULL) {
+               event_warn("%s: strdup", __func__);
+               mm_free(http_cb);
+               return (-3);
+       }
        http_cb->cb = cb;
        http_cb->cbarg = cbarg;
 
@@ -3911,6 +3920,10 @@ parse_authority(struct evhttp_uri *uri, char *s, char *eos)
        EVUTIL_ASSERT(eos);
        if (eos == s) {
                uri->host = mm_strdup("");
+               if (uri->host == NULL) {
+                       event_warn("%s: strdup", __func__);
+                       return -1;
+               }
                return 0;
        }
 
@@ -3922,6 +3935,10 @@ parse_authority(struct evhttp_uri *uri, char *s, char *eos)
                        return -1;
                *cp++ = '\0';
                uri->userinfo = mm_strdup(s);
+               if (uri->userinfo == NULL) {
+                       event_warn("%s: strdup", __func__);
+                       return -1;
+               }
        } else {
                cp = s;
        }
@@ -3949,6 +3966,10 @@ parse_authority(struct evhttp_uri *uri, char *s, char *eos)
                        return -1;
        }
        uri->host = mm_malloc(eos-cp+1);
+       if (uri->host == NULL) {
+               event_warn("%s: malloc", __func__);
+               return -1;
+       }
        memcpy(uri->host, cp, eos-cp);
        uri->host[eos-cp] = '\0';
        return 0;
@@ -4039,7 +4060,10 @@ evhttp_uri_parse(const char *source_uri)
        if (token && scheme_ok(readp,token)) {
                *token = '\0';
                uri->scheme = mm_strdup(readp);
-
+               if (uri->scheme == NULL) {
+                       event_err(1, "%s: strdup", __func__);
+                       goto err;
+               }
                readp = token+1; /* eat : */
        }
 
@@ -4096,11 +4120,25 @@ evhttp_uri_parse(const char *source_uri)
 
        EVUTIL_ASSERT(path);
        uri->path = mm_strdup(path);
+       if (uri->path == NULL) {
+               event_err(1, "%s: strdup", __func__);
+               goto err;
+       }
 
-       if (query)
+       if (query) {
                uri->query = mm_strdup(query);
-       if (fragment)
+               if (uri->query == NULL) {
+                       event_err(1, "%s: strdup", __func__);
+                       goto err;
+               }
+       }
+       if (fragment) {
                uri->fragment = mm_strdup(fragment);
+               if (uri->fragment == NULL) {
+                       event_err(1, "%s: strdup", __func__);
+                       goto err;
+               }
+       }
 
        mm_free(readbuf);
 
index 527462ca26ba167533cbaf48651e969c25f9bfad..993a4e603008f9fa8356be454e4459adb6727903 100644 (file)
--- a/select.c
+++ b/select.c
@@ -99,7 +99,10 @@ select_init(struct event_base *base)
        if (!(sop = mm_calloc(1, sizeof(struct selectop))))
                return (NULL);
 
-       select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask));
+       if (select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask))) {
+               mm_free(sop);
+               return (NULL);
+       }
 
        evsig_init(base);
 
@@ -198,8 +201,10 @@ select_resize(struct selectop *sop, int fdsz)
        if ((readset_in = mm_realloc(sop->event_readset_in, fdsz)) == NULL)
                goto error;
        sop->event_readset_in = readset_in;
-       if ((writeset_in = mm_realloc(sop->event_writeset_in, fdsz)) == NULL)
+       if ((writeset_in = mm_realloc(sop->event_writeset_in, fdsz)) == NULL) {
+               mm_free(readset_in);
                goto error;
+       }
        sop->event_writeset_in = writeset_in;
        sop->resize_out_sets = 1;