summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-10-28 09:28:05 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-10-29 22:52:57 +0100
commit49e649da84e4578b3ce5bac190f503a295a6678b (patch)
tree97213435d44104e4217159001944504ce518158d
parent4011802b35638e311e548e8893fa74373275145a (diff)
downloadcurl-bagder/curl_close-zero.tar.gz
url: make Curl_close() NULLify the pointer toobagder/curl_close-zero
This is the common pattern used in the code and by a unified approach we avoid mistakes. Closes #4534
-rw-r--r--lib/conncache.c8
-rw-r--r--lib/doh.c14
-rw-r--r--lib/easy.c2
-rw-r--r--lib/http2.c12
-rw-r--r--lib/url.c14
-rw-r--r--lib/url.h2
-rw-r--r--tests/unit/unit1620.c4
7 files changed, 25 insertions, 31 deletions
diff --git a/lib/conncache.c b/lib/conncache.c
index 2f4dd4bc3..57d6061fd 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -143,10 +143,8 @@ int Curl_conncache_init(struct conncache *connc, int size)
rc = Curl_hash_init(&connc->hash, size, Curl_hash_str,
Curl_str_key_compare, free_bundle_hash_entry);
- if(rc) {
- Curl_close(connc->closure_handle);
- connc->closure_handle = NULL;
- }
+ if(rc)
+ Curl_close(&connc->closure_handle);
else
connc->closure_handle->state.conn_cache = connc;
@@ -595,7 +593,7 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
Curl_hostcache_clean(connc->closure_handle,
connc->closure_handle->dns.hostcache);
- Curl_close(connc->closure_handle);
+ Curl_close(&connc->closure_handle);
sigpipe_restore(&pipe_st);
}
}
diff --git a/lib/doh.c b/lib/doh.c
index 196e89d93..d1795789e 100644
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -346,7 +346,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
error:
free(nurl);
- Curl_close(doh);
+ Curl_close(&doh);
return result;
}
@@ -402,10 +402,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
error:
curl_slist_free_all(data->req.doh.headers);
data->req.doh.headers = NULL;
- Curl_close(data->req.doh.probe[0].easy);
- data->req.doh.probe[0].easy = NULL;
- Curl_close(data->req.doh.probe[1].easy);
- data->req.doh.probe[1].easy = NULL;
+ Curl_close(&data->req.doh.probe[0].easy);
+ Curl_close(&data->req.doh.probe[1].easy);
return NULL;
}
@@ -925,11 +923,9 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct dohentry de;
/* remove DOH handles from multi handle and close them */
curl_multi_remove_handle(data->multi, data->req.doh.probe[0].easy);
- Curl_close(data->req.doh.probe[0].easy);
- data->req.doh.probe[0].easy = NULL;
+ Curl_close(&data->req.doh.probe[0].easy);
curl_multi_remove_handle(data->multi, data->req.doh.probe[1].easy);
- Curl_close(data->req.doh.probe[1].easy);
- data->req.doh.probe[1].easy = NULL;
+ Curl_close(&data->req.doh.probe[1].easy);
/* parse the responses, create the struct and return it! */
init_dohentry(&de);
rc = doh_decode(data->req.doh.probe[0].serverdoh.memory,
diff --git a/lib/easy.c b/lib/easy.c
index cbb65a5f6..001648d49 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -731,7 +731,7 @@ void curl_easy_cleanup(struct Curl_easy *data)
return;
sigpipe_ignore(data, &pipe_st);
- Curl_close(data);
+ Curl_close(&data);
sigpipe_restore(&pipe_st);
}
diff --git a/lib/http2.c b/lib/http2.c
index bae938811..6315fc401 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -496,16 +496,14 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
/* setup the request struct */
struct HTTP *http = calloc(1, sizeof(struct HTTP));
if(!http) {
- (void)Curl_close(second);
- second = NULL;
+ (void)Curl_close(&second);
}
else {
second->req.protop = http;
http->header_recvbuf = Curl_add_buffer_init();
if(!http->header_recvbuf) {
free(http);
- (void)Curl_close(second);
- second = NULL;
+ (void)Curl_close(&second);
}
else {
Curl_http2_setup_req(second);
@@ -547,7 +545,7 @@ static int push_promise(struct Curl_easy *data,
stream = data->req.protop;
if(!stream) {
failf(data, "Internal NULL stream!\n");
- (void)Curl_close(newhandle);
+ (void)Curl_close(&newhandle);
rv = 1;
goto fail;
}
@@ -569,7 +567,7 @@ static int push_promise(struct Curl_easy *data,
/* denied, kill off the new handle again */
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- (void)Curl_close(newhandle);
+ (void)Curl_close(&newhandle);
goto fail;
}
@@ -585,7 +583,7 @@ static int push_promise(struct Curl_easy *data,
infof(data, "failed to add handle to multi\n");
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- Curl_close(newhandle);
+ Curl_close(&newhandle);
rv = 1;
goto fail;
}
diff --git a/lib/url.c b/lib/url.c
index bbae273fd..8285474fd 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -317,13 +317,17 @@ static void up_free(struct Curl_easy *data)
* when curl_easy_perform() is invoked.
*/
-CURLcode Curl_close(struct Curl_easy *data)
+CURLcode Curl_close(struct Curl_easy **datap)
{
struct Curl_multi *m;
+ struct Curl_easy *data;
- if(!data)
+ if(!datap || !*datap)
return CURLE_OK;
+ data = *datap;
+ *datap = NULL;
+
Curl_expire_clear(data); /* shut off timers */
m = data->multi;
@@ -1983,10 +1987,8 @@ void Curl_free_request_state(struct Curl_easy *data)
{
Curl_safefree(data->req.protop);
Curl_safefree(data->req.newurl);
- Curl_close(data->req.doh.probe[0].easy);
- data->req.doh.probe[0].easy = NULL;
- Curl_close(data->req.doh.probe[1].easy);
- data->req.doh.probe[1].easy = NULL;
+ Curl_close(&data->req.doh.probe[0].easy);
+ Curl_close(&data->req.doh.probe[1].easy);
}
diff --git a/lib/url.h b/lib/url.h
index f4d611add..053fbdffc 100644
--- a/lib/url.h
+++ b/lib/url.h
@@ -49,7 +49,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data);
void Curl_freeset(struct Curl_easy * data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
-CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
+CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
CURLcode Curl_disconnect(struct Curl_easy *data,
struct connectdata *, bool dead_connection);
diff --git a/tests/unit/unit1620.c b/tests/unit/unit1620.c
index b8b096521..c6aa721cf 100644
--- a/tests/unit/unit1620.c
+++ b/tests/unit/unit1620.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -83,7 +83,7 @@ UNITTEST_START
Curl_free_request_state(empty);
- rc = Curl_close(empty);
+ rc = Curl_close(&empty);
fail_unless(rc == CURLE_OK, "Curl_close() failed");
}