From 61c21492680505706cad9240c39666ee3b56a89c Mon Sep 17 00:00:00 2001
From: Azat Khuzhin <a3at.mail@gmail.com>
Date: Tue, 9 Jan 2018 21:44:57 +0300
Subject: [PATCH] http: fix leaks in evhttp_uriencode()

Fixes: #584
---
 http.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/http.c b/http.c
index f2e49719..c0e7adfc 100644
--- 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 *
-- 
2.40.0