changeset 19822:554ef83e133c

lib-http: Always set *_obj=NULL first in deinit functions (mainly for consistency) This doesn't usually matter, but in case deinit calls some callback they may be trying to access the partially destroyed object.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 22 Feb 2016 21:17:26 +0200
parents f48a7703d596
children 34733f49f6e2
files src/lib-http/http-client-peer.c src/lib-http/http-client.c src/lib-http/http-header-parser.c src/lib-http/http-request-parser.c src/lib-http/http-response-parser.c src/lib-http/http-server-response.c src/lib-http/http-server.c
diffstat 7 files changed, 14 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-client-peer.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-client-peer.c	Mon Feb 22 21:17:26 2016 +0200
@@ -503,6 +503,8 @@
 {
 	struct http_client_peer *peer = *_peer;
 
+	*_peer = NULL;
+
 	if (peer->destroyed)
 		return;
 	peer->destroyed = TRUE;
@@ -524,7 +526,6 @@
 
 	i_free(peer->addr_name);
 	i_free(peer);
-	*_peer = NULL;
 }
 
 struct http_client_peer *
--- a/src/lib-http/http-client.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-client.c	Mon Feb 22 21:17:26 2016 +0200
@@ -166,6 +166,8 @@
 	struct http_client_host *host;
 	struct http_client_peer *peer;
 
+	*_client = NULL;
+
 	/* drop delayed failing requests */
 	while (array_count(&client->delayed_failing_requests) > 0) {
 		req_idx = array_idx(&client->delayed_failing_requests, 0);
@@ -198,7 +200,6 @@
 	if (client->ssl_ctx != NULL)
 		ssl_iostream_context_deinit(&client->ssl_ctx);
 	pool_unref(&client->pool);
-	*_client = NULL;
 }
 
 void http_client_switch_ioloop(struct http_client *client)
--- a/src/lib-http/http-header-parser.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-header-parser.c	Mon Feb 22 21:17:26 2016 +0200
@@ -69,11 +69,12 @@
 {
 	struct http_header_parser *parser = *_parser;
 
+	*_parser = NULL;
+
 	//i_stream_skip(ctx->input, ctx->skip);
 	buffer_free(&parser->value_buf);
 	str_free(&parser->name);
 	i_free(parser);
-	*_parser = NULL;
 }
 
 void http_header_parser_reset(struct http_header_parser *parser)
--- a/src/lib-http/http-request-parser.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-request-parser.c	Mon Feb 22 21:17:26 2016 +0200
@@ -74,9 +74,9 @@
 {
 	struct http_request_parser *parser = *_parser;
 
-	http_message_parser_deinit(&parser->parser);
+	*_parser = NULL;
 
-	*_parser = NULL;
+	http_message_parser_deinit(&parser->parser);
 	i_free(parser);
 }
 
--- a/src/lib-http/http-response-parser.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-response-parser.c	Mon Feb 22 21:17:26 2016 +0200
@@ -46,9 +46,9 @@
 {
 	struct http_response_parser *parser = *_parser;
 
-	http_message_parser_deinit(&parser->parser);
+	*_parser = NULL;
 
-	*_parser = NULL;
+	http_message_parser_deinit(&parser->parser);
 	i_free(parser);
 }
 
--- a/src/lib-http/http-server-response.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-server-response.c	Mon Feb 22 21:17:26 2016 +0200
@@ -459,10 +459,10 @@
 	struct http_server_response *resp = *_resp;
 	struct http_server_request *req = resp->request;
 
+	*_resp = NULL;
+
 	http_server_request_abort(&req,
 		"Aborted sending response payload");
-
-	*_resp = NULL;
 }
 
 static void
--- a/src/lib-http/http-server.c	Mon Feb 22 21:15:37 2016 +0200
+++ b/src/lib-http/http-server.c	Mon Feb 22 21:17:26 2016 +0200
@@ -45,12 +45,13 @@
 {
 	struct http_server *server = *_server;
 
+	*_server = NULL;
+
 	connection_list_deinit(&server->conn_list);
 
 	if (server->ssl_ctx != NULL)
 		ssl_iostream_context_deinit(&server->ssl_ctx);
 	pool_unref(&server->pool);
-	*_server = NULL;
 }
 
 void http_server_switch_ioloop(struct http_server *server)