changeset 19234:44dd7e81a38b

lib-http: Disconnection from HTTP server could have caused accessing already freed memory. Freeing a request could have freed the connection.
author Timo Sirainen <tss@iki.fi>
date Mon, 28 Sep 2015 13:51:49 +0300
parents 14f670053196
children 77486e114423
files src/lib-http/http-client-connection.c
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-client-connection.c	Mon Sep 28 12:33:33 2015 +0300
+++ b/src/lib-http/http-client-connection.c	Mon Sep 28 13:51:49 2015 +0300
@@ -487,7 +487,7 @@
 	struct http_client_request *req, struct http_response *response)
 {
 	struct istream *payload;
-	bool retrying;
+	bool retrying, ret;
 
 	i_assert(!conn->in_req_callback);
 	i_assert(conn->incoming_payload == NULL);
@@ -541,6 +541,7 @@
 		return TRUE;
 	}
 
+	http_client_connection_ref(conn);
 	if (response->payload != NULL) {
 		req->state = HTTP_REQUEST_STATE_PAYLOAD_IN;
 		payload = response->payload;
@@ -563,10 +564,12 @@
 	if (conn->incoming_payload == NULL) {
 		i_assert(conn->conn.io != NULL ||
 			conn->peer->addr.type == HTTP_CLIENT_PEER_ADDR_RAW);
-		return TRUE;
+		ret = TRUE;
+	} else {
+		ret = FALSE;
 	}
-
-	return FALSE;
+	http_client_connection_unref(&conn);
+	return ret;
 }
 
 static void http_client_connection_input(struct connection *_conn)