curl: fix integer constant typechecks with curl_easy_setopt()

The curl documentation specifies that curl_easy_setopt() takes either: ...a long, a function pointer, an object pointer or a curl_off_t, depending on what the specific option expects. But when we pass an integer constant like "0", it will by default be a regular non-long int. This has always been wrong, but seemed to work in practice (I didn't dig into curl's implementation to see whether this might actually be triggering undefined behavior, but it seems likely and regardless we should do what the docs say). This is especially important since curl has a type-checking macro that causes building against curl 8.14 to produce many warnings. The specific commit is due to their 79b4e56b3 (typecheck-gcc.h: fix the typechecks, 2025-04-22). Curiously, it does only seem to trigger when compiled with -O2 for me. We can fix it by just marking the constants with a long "L". Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Jun 4, 2025 at 16:55 UTC 6f11c42e8edc5cf7d65156c9dd68e720f1b92229
3 files changed +11 -11
http-push.c
+1 -1
@@ -195,7 +195,7 @@ static char *xml_entities(const char *s)
195 static void curl_setup_http_get(CURL *curl, const char *url,
196 const char *custom_req)
197 {
198 - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
198 + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
199 curl_easy_setopt(curl, CURLOPT_URL, url);
200 curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, custom_req);
201 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite_null);
http.c
+7 -7
@@ -1019,13 +1019,13 @@ static CURL *get_curl_handle(void)
1019 die("curl_easy_init failed");
1020
1021 if (!curl_ssl_verify) {
1022 - curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0);
1023 - curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0);
1022 + curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0L);
1023 + curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0L);
1024 } else {
1025 /* Verify authenticity of the peer's certificate */
1026 - curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 1);
1026 + curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 1L);
1027 /* The name in the cert must match whom we tried to connect */
1028 - curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 2);
1028 + curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 2L);
1029 }
1030
1031 if (curl_http_version) {
@@ -1117,7 +1117,7 @@ static CURL *get_curl_handle(void)
1117 curl_low_speed_time);
1118 }
1119
1120 - curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
1120 + curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20L);
1121 curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
1122
1123 #ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR
@@ -1151,7 +1151,7 @@ static CURL *get_curl_handle(void)
1151 user_agent ? user_agent : git_user_agent());
1152
1153 if (curl_ftp_no_epsv)
1154 - curl_easy_setopt(result, CURLOPT_FTP_USE_EPSV, 0);
1154 + curl_easy_setopt(result, CURLOPT_FTP_USE_EPSV, 0L);
1155
1156 if (curl_ssl_try)
1157 curl_easy_setopt(result, CURLOPT_USE_SSL, CURLUSESSL_TRY);
@@ -1254,7 +1254,7 @@ static CURL *get_curl_handle(void)
1254 }
1255 init_curl_proxy_auth(result);
1256
1257 - curl_easy_setopt(result, CURLOPT_TCP_KEEPALIVE, 1);
1257 + curl_easy_setopt(result, CURLOPT_TCP_KEEPALIVE, 1L);
1258
1259 if (curl_tcp_keepidle > -1)
1260 curl_easy_setopt(result, CURLOPT_TCP_KEEPIDLE,
remote-curl.c
+3 -3
@@ -877,12 +877,12 @@ static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
877 headers = curl_slist_append(headers, rpc->hdr_content_type);
878 headers = curl_slist_append(headers, rpc->hdr_accept);
879
880 - curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
881 - curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
880 + curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0L);
881 + curl_easy_setopt(slot->curl, CURLOPT_POST, 1L);
882 curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
883 curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL);
884 curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000");
885 - curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4);
885 + curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4L);
886 curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
887 curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
888 curl_easy_setopt(slot->curl, CURLOPT_WRITEDATA, &buf);