changeset 21739:69f17440719c

lib-oauth2: Don't free oauth2_request too early. Move the freeing explicitly to only after calling the callback. The previous method of freeing it on when http_request was destroyed could have happened too early when oauth2_parse_json() called i_stream_unref(), which released the last reference to the http_request.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 16 Mar 2017 01:22:09 +0200
parents 29066a72703a
children 3ce8158b7fd5
files src/lib-oauth2/oauth2-introspect.c src/lib-oauth2/oauth2-refresh.c src/lib-oauth2/oauth2-token-validate.c
diffstat 3 files changed, 3 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-oauth2/oauth2-introspect.c	Thu Mar 16 01:12:57 2017 +0200
+++ b/src/lib-oauth2/oauth2-introspect.c	Thu Mar 16 01:22:09 2017 +0200
@@ -19,6 +19,7 @@
 	oauth2_introspection_callback_t *callback = req->is_callback;
 	req->is_callback = NULL;
 	callback(res, req->is_context);
+	oauth2_request_free_internal(req);
 }
 
 static void
@@ -62,7 +63,6 @@
 		.error = req->delayed_error
 	};
 	oauth2_introspection_callback(req, &fail);
-	oauth2_request_free_internal(req);
 }
 
 #undef oauth2_introspection_start
@@ -129,7 +129,6 @@
 
 	http_client_request_set_timeout_msecs(req->req,
 					      req->set->timeout_msecs);
-	http_client_request_set_destroy_callback(req->req, oauth2_request_free_internal, req);
 	http_client_request_submit(req->req);
 
 	return req;
--- a/src/lib-oauth2/oauth2-refresh.c	Thu Mar 16 01:12:57 2017 +0200
+++ b/src/lib-oauth2/oauth2-refresh.c	Thu Mar 16 01:22:09 2017 +0200
@@ -19,6 +19,7 @@
 	oauth2_refresh_callback_t *callback = req->re_callback;
 	req->re_callback = NULL;
 	callback(res, req->re_context);
+	oauth2_request_free_internal(req);
 }
 
 static bool
@@ -102,7 +103,6 @@
 		.error = req->delayed_error
 	};
 	oauth2_refresh_callback(req, &fail);
-	oauth2_request_free_internal(req);
 }
 
 #undef oauth2_refresh_start
@@ -161,7 +161,6 @@
 	i_stream_unref(&is);
 	http_client_request_set_timeout_msecs(req->req,
 					      req->set->timeout_msecs);
-	http_client_request_set_destroy_callback(req->req, oauth2_request_free_internal, req);
 	http_client_request_submit(req->req);
 
 	return req;
--- a/src/lib-oauth2/oauth2-token-validate.c	Thu Mar 16 01:12:57 2017 +0200
+++ b/src/lib-oauth2/oauth2-token-validate.c	Thu Mar 16 01:22:09 2017 +0200
@@ -20,6 +20,7 @@
 	oauth2_token_validation_callback_t *callback = req->tv_callback;
 	req->tv_callback = NULL;
 	callback(res, req->tv_context);
+	oauth2_request_free_internal(req);
 }
 
 static void
@@ -90,7 +91,6 @@
 		.error = req->delayed_error
 	};
 	oauth2_token_validation_callback(req, &fail);
-	oauth2_request_free_internal(req);
 }
 
 #undef oauth2_token_validation_start
@@ -143,7 +143,6 @@
 
 	http_client_request_set_timeout_msecs(req->req,
 					      req->set->timeout_msecs);
-	http_client_request_set_destroy_callback(req->req, oauth2_request_free_internal, req);
 	http_client_request_submit(req->req);
 
 	return req;