summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2022-05-09 18:20:02 +0200
committerMark Wielaard <mark@klomp.org>2022-05-14 15:22:54 +0200
commit4a13bd2cf82a401cbe5850fe9a8bd3fcb5b13bfb (patch)
tree788c511bb24d520ea103d01cf87317d18b304353
parentb814a7e45199d1c0812f3dffc23284ef66988f1e (diff)
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>
-rw-r--r--debuginfod/ChangeLog5
-rw-r--r--debuginfod/debuginfod-client.c61
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);
}