From dcd7e37c3a0ce108635b89cacc1e3425e57bd3bc Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 28 Oct 2019 09:28:05 +0100 Subject: url: make Curl_close() NULLify the pointer too This is the common pattern used in the code and by a unified approach we avoid mistakes. Closes #4534 --- lib/conncache.c | 8 +++----- lib/doh.c | 14 +++++--------- lib/easy.c | 2 +- lib/http2.c | 12 +++++------- lib/url.c | 14 ++++++++------ lib/url.h | 2 +- tests/unit/unit1620.c | 4 ++-- 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, , et al. + * Copyright (C) 1998 - 2019, Daniel Stenberg, , 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"); } -- cgit v1.2.3