]> granicus.if.org Git - libevent/commitdiff
http: fix leaks in evhttp_uriencode()
authorAzat Khuzhin <a3at.mail@gmail.com>
Tue, 9 Jan 2018 18:44:57 +0000 (21:44 +0300)
committerAzat Khuzhin <a3at.mail@gmail.com>
Tue, 9 Jan 2018 18:47:57 +0000 (21:47 +0300)
Fixes: #584
http.c

diff --git a/http.c b/http.c
index f2e49719b2249abf7b855d16a3406d808ebd6013..c0e7adfc2cdf6ffa430b06216410c7fe6f76db35 100644 (file)
--- a/http.c
+++ b/http.c
@@ -3071,16 +3071,15 @@ evhttp_uriencode(const char *uri, ev_ssize_t len, int space_as_plus)
 {
        struct evbuffer *buf = evbuffer_new();
        const char *p, *end;
-       char *result;
+       char *result = NULL;
 
-       if (buf == NULL) {
-               return (NULL);
+       if (!buf) {
+               goto out;
        }
 
-
        if (len >= 0) {
                if (uri + len < uri) {
-                       return (NULL);
+                       goto out;
                }
 
                end = uri + len;
@@ -3089,11 +3088,11 @@ evhttp_uriencode(const char *uri, ev_ssize_t len, int space_as_plus)
 
                if (slen >= EV_SSIZE_MAX) {
                        /* we don't want to mix signed and unsigned */
-                       return (NULL);
+                       goto out;
                }
 
                if (uri + slen < uri) {
-                       return (NULL);
+                       goto out;
                }
 
                end = uri + slen;
@@ -3115,9 +3114,10 @@ evhttp_uriencode(const char *uri, ev_ssize_t len, int space_as_plus)
        if (result)
                evbuffer_remove(buf, result, evbuffer_get_length(buf));
 
-       evbuffer_free(buf);
-
-       return (result);
+out:
+       if (buf)
+               evbuffer_free(buf);
+       return result;
 }
 
 char *