diff options
author | Mark Wielaard <mark@klomp.org> | 2022-05-09 18:20:02 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2022-05-14 15:22:54 +0200 |
commit | 4a13bd2cf82a401cbe5850fe9a8bd3fcb5b13bfb (patch) | |
tree | 788c511bb24d520ea103d01cf87317d18b304353 /debuginfod | |
parent | b814a7e45199d1c0812f3dffc23284ef66988f1e (diff) | |
download | elfutils-4a13bd2cf82a401cbe5850fe9a8bd3fcb5b13bfb.tar.gz |
debuginfod: Check all curl_easy_setopt calls
curl_easy_setup can fail for various reasons. Add a curl_easy_setopt_ck
macro to check all curl_easy_setopt calls and provides a human readable
error message in verbose mode.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'debuginfod')
-rw-r--r-- | debuginfod/ChangeLog | 5 | ||||
-rw-r--r-- | debuginfod/debuginfod-client.c | 61 |
2 files changed, 44 insertions, 22 deletions
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 8f69409b..505ff2e7 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,5 +1,10 @@ 2022-05-09 Mark Wielaard <mark@klomp.org> + * debuginfod-client.c (debuginfod_query_server): Add + curl_easy_setopt_ck macro, use it for all curl_easy_setopt calls. + +2022-05-09 Mark Wielaard <mark@klomp.org> + * debuginfod-client.c (debuginfod_write_callback): Check result of curl_easy_getinfo. diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 882a809a..89208216 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -1032,43 +1032,60 @@ debuginfod_query_server (debuginfod_client *c, if (vfd >= 0) dprintf (vfd, "url %d %s\n", i, data[i].url); + /* Some boilerplate for checking curl_easy_setopt. */ +#define curl_easy_setopt_ck(H,O,P) do { \ + CURLcode curl_res = curl_easy_setopt (H,O,P); \ + if (curl_res != CURLE_OK) \ + { \ + if (vfd >= 0) \ + dprintf (vfd, \ + "Bad curl_easy_setopt: %s\n", \ + curl_easy_strerror(curl_res)); \ + rc = -EINVAL; \ + goto out2; \ + } \ + } while (0) + /* Only allow http:// + https:// + file:// so we aren't being redirected to some unsupported protocol. */ - curl_easy_setopt(data[i].handle, CURLOPT_PROTOCOLS, - CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FILE); - curl_easy_setopt(data[i].handle, CURLOPT_URL, data[i].url); + curl_easy_setopt_ck(data[i].handle, CURLOPT_PROTOCOLS, + (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FILE)); + curl_easy_setopt_ck(data[i].handle, CURLOPT_URL, data[i].url); if (vfd >= 0) - curl_easy_setopt(data[i].handle, CURLOPT_ERRORBUFFER, data[i].errbuf); - curl_easy_setopt(data[i].handle, - CURLOPT_WRITEFUNCTION, - debuginfod_write_callback); - curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); + curl_easy_setopt_ck(data[i].handle, CURLOPT_ERRORBUFFER, + data[i].errbuf); + curl_easy_setopt_ck(data[i].handle, + CURLOPT_WRITEFUNCTION, + debuginfod_write_callback); + curl_easy_setopt_ck(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); if (timeout > 0) { /* Make sure there is at least some progress, try to get at least 100K per timeout seconds. */ - curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_TIME, - timeout); - curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_LIMIT, - 100 * 1024L); + curl_easy_setopt_ck (data[i].handle, CURLOPT_LOW_SPEED_TIME, + timeout); + curl_easy_setopt_ck (data[i].handle, CURLOPT_LOW_SPEED_LIMIT, + 100 * 1024L); } data[i].response_data = NULL; data[i].response_data_size = 0; - curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_NOSIGNAL, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_HEADERFUNCTION, header_callback); - curl_easy_setopt(data[i].handle, CURLOPT_HEADERDATA, (void *) &(data[i])); + curl_easy_setopt_ck(data[i].handle, CURLOPT_FILETIME, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_FAILONERROR, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_NOSIGNAL, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_HEADERFUNCTION, + header_callback); + curl_easy_setopt_ck(data[i].handle, CURLOPT_HEADERDATA, + (void *) &(data[i])); #if LIBCURL_VERSION_NUM >= 0x072a00 /* 7.42.0 */ - curl_easy_setopt(data[i].handle, CURLOPT_PATH_AS_IS, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_PATH_AS_IS, (long) 1); #else /* On old curl; no big deal, canonicalization here is almost the same, except perhaps for ? # type decorations at the tail. */ #endif - curl_easy_setopt(data[i].handle, CURLOPT_AUTOREFERER, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_ACCEPT_ENCODING, ""); - curl_easy_setopt(data[i].handle, CURLOPT_HTTPHEADER, c->headers); + curl_easy_setopt_ck(data[i].handle, CURLOPT_AUTOREFERER, (long) 1); + curl_easy_setopt_ck(data[i].handle, CURLOPT_ACCEPT_ENCODING, ""); + curl_easy_setopt_ck(data[i].handle, CURLOPT_HTTPHEADER, c->headers); curl_multi_add_handle(curlm, data[i].handle); } |