curl: pass `long` values where expected
PATCH 1/1 curl: pass `long` values where expected
From: Johannes Schindelin <[email protected]>
As of Homebrew's update to cURL v8.14.0, there are new compile errors to be observed in the osx-gcc job of Git's CI builds:
In file included from http.h:8,
from imap-send.c:36:
In function 'setup_curl',
inlined from 'curl_append_msgs_to_imap' at imap-send.c:1460:9,
inlined from 'cmd_main' at imap-send.c:1581:9:
/usr/local/Cellar/curl/8.14.0/include/curl/typecheck-gcc.h:50:15: error: call to '_curl_easy_setopt_err_long' declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
50 | _curl_easy_setopt_err_long(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/Cellar/curl/8.14.0/include/curl/curl.h:54:7: note: in definition of macro 'CURL_IGNORE_DEPRECATION'
54 | statements \
| ^~~~~~~~~~
imap-send.c:1423:9: note: in expansion of macro 'curl_easy_setopt'
1423 | curl_easy_setopt(curl, CURLOPT_PORT, srvc->port);
| ^~~~~~~~~~~~~~~~[... many more instances of nearly identical warnings...]
See for example this CI workflow run:
https://github.com/git/git/actions/runs/15454602308/job/43504278284#step:4:307
The most likely explanation is the entry "typecheck-gcc.h: fix the typechecks" in cURL's release notes (https://curl.se/ch/8.14.0.html).
Let's explicitly convert all int parameters in curl_easy_setopt() calls to long parameters.
---
curl: pass long values where expected
This came up during the release process of Git for Windows v2.50.0-rc1.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1931%2Fdscho%2Fcurl-options-want-long-instead-of-int-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1931/dscho/curl-options-want-long-instead-of-int-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1931
http-push.c | 8 ++++---- http.c | 50 +++++++++++++++++++++++++------------------------- imap-send.c | 6 +++--- remote-curl.c | 12 ++++++------ 4 files changed, 38 insertions(+), 38 deletions(-)
http-push.c +4 -4
@@ -195,7 +195,7 @@ static char *xml_entities(const char *s)static void curl_setup_http_get (CURL *curl,const char *url,const char *custom_req) { -curl_easy_setopt (curl,CURLOPT_HTTPGET ,1 ); +curl_easy_setopt (curl,CURLOPT_HTTPGET ,1l );curl_easy_setopt (curl,CURLOPT_URL , url);curl_easy_setopt (curl,CURLOPT_CUSTOMREQUEST , custom_req);curl_easy_setopt (curl,CURLOPT_WRITEFUNCTION , fwrite_null);
@@ -205,7 +205,7 @@ static void curl_setup_http(CURL *curl, const char *url, const char *custom_req, struct buffer *buffer, curl_write_callback write_fn) { - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1l);curl_easy_setopt (curl,CURLOPT_URL , url);curl_easy_setopt (curl,CURLOPT_INFILE , buffer);curl_easy_setopt (curl,CURLOPT_INFILESIZE , buffer->buf.len);
@@ -213,9 +213,9 @@ static void curl_setup_http(CURL *curl, const char *url,curl_easy_setopt (curl,CURLOPT_SEEKFUNCTION , seek_buffer);curl_easy_setopt (curl,CURLOPT_SEEKDATA , buffer);curl_easy_setopt (curl,CURLOPT_WRITEFUNCTION , write_fn); -curl_easy_setopt (curl,CURLOPT_NOBODY ,0 ); +curl_easy_setopt (curl,CURLOPT_NOBODY ,0l );curl_easy_setopt (curl,CURLOPT_CUSTOMREQUEST , custom_req); -curl_easy_setopt (curl,CURLOPT_UPLOAD ,1 ); +curl_easy_setopt (curl,CURLOPT_UPLOAD ,1l ); }static struct curl_slist *get_dav_token_headers (struct remote_lock *lock,enum dav_header_flag options)
http.c +25 -25
136 lines not on this page · raw message
imap-send.c +3 -3
@@ -1420,7 +1420,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)curl_easy_setopt (curl,CURLOPT_URL , path.buf);strbuf_release (&path); -curl_easy_setopt (curl,CURLOPT_PORT , srvc->port); +curl_easy_setopt (curl,CURLOPT_PORT , (long )srvc->port);if (srvc->auth_method) {struct strbuf auth =STRBUF_INIT ;
@@ -1433,8 +1433,8 @@ static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)if (!srvc->use_ssl)curl_easy_setopt (curl,CURLOPT_USE_SSL , (long )CURLUSESSL_TRY ); -curl_easy_setopt (curl,CURLOPT_SSL_VERIFYPEER , srvc->ssl_verify); -curl_easy_setopt (curl,CURLOPT_SSL_VERIFYHOST , srvc->ssl_verify); +curl_easy_setopt (curl,CURLOPT_SSL_VERIFYPEER , (long )srvc->ssl_verify); +curl_easy_setopt (curl,CURLOPT_SSL_VERIFYHOST , (long )srvc->ssl_verify);curl_easy_setopt (curl,CURLOPT_READFUNCTION , fread_buffer);
remote-curl.c +6 -6
@@ -877,12 +877,12 @@ static int probe_rpc(struct rpc_state *rpc, struct slot_results *results) headers =curl_slist_append (headers, rpc->hdr_content_type); headers =curl_slist_append (headers, rpc->hdr_accept); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0l ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1l );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDS ,"0000" ); -curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,4 ); +curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,4l );curl_easy_setopt (slot->curl,CURLOPT_HTTPHEADER , headers);curl_easy_setopt (slot->curl,CURLOPT_WRITEFUNCTION , fwrite_buffer);curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , &buf);
@@ -970,8 +970,8 @@ retry: slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0l ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1l );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" );
@@ -1058,7 +1058,7 @@ retry: rpc_in_data.check_pktline = stateless_connect;memset (&rpc_in_data.pktline_state,0 ,sizeof (rpc_in_data.pktline_state));curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , &rpc_in_data); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0l ); rpc->any_written =0 ;
base-commit: 0d42fbd9a1f30c63cf0359a1c5aaa77020972f72
Signature · 1 line
gitgitgadget
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
As of Homebrew's update to cURL v8.14.0, there are new compile errors to be observed in the
osx-gccjob of Git's CI builds:
This overlaps with King’s https://lore.kernel.org/git/[email protected]/
Hi Kristoffer,
Quoted 7 lines · Kristoffer Haugsbakk
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
As of Homebrew's update to cURL v8.14.0, there are new compile errors to be observed in the
osx-gccjob of Git's CI builds:This overlaps with King’s https://lore.kernel.org/git/[email protected]/
Thank you for the heads-up! When I had to start fixing those builds, I had a quick look but did not find any report on the Git mailing list. But I see gaps, and I will comment on Jeff's patch.
Thanks!
Johannes
v2 cover curl: pass long values where expected
In reply to Johannes Schindelin via GitGitGadgetThis came up during the release process of Git for Windows v2.50.0-rc1.
Changes since v1:
* Rebased on top of jk/curl-easy-setopt-typefix.
Jeff King (3):
curl: fix integer constant typechecks with curl_easy_setopt()
curl: fix integer variable typechecks with curl_easy_setopt()
curl: fix symbolic constant typechecks with curl_easy_setopt()
Johannes Schindelin (1):
curl: pass long values where expected
http-push.c | 8 ++++---- http.c | 50 +++++++++++++++++++++++++------------------------- imap-send.c | 6 +++--- remote-curl.c | 12 ++++++------ 4 files changed, 38 insertions(+), 38 deletions(-)
base-commit: 0bd2d791cc9f745ebaedafc0e1cbebdebe41343e
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1931%2Fdscho%2Fcurl-options-want-long-instead-of-int-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1931/dscho/curl-options-want-long-instead-of-int-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1931
Range-diff vs v1:
-: ----------- > 1: 6f11c42e8ed curl: fix integer constant typechecks with curl_easy_setopt()
-: ----------- > 2: 30325e23ba0 curl: fix integer variable typechecks with curl_easy_setopt()
-: ----------- > 3: 4558c8f84b2 curl: fix symbolic constant typechecks with curl_easy_setopt()
1: 803e235837e ! 4: 80de7491d24 curl: pass `long` values where expected
@@ Commit message
The most likely explanation is the entry "typecheck-gcc.h: fix the
typechecks" in cURL's release notes (https://curl.se/ch/8.14.0.html).
- Let's explicitly convert all `int` parameters in `curl_easy_setopt()`
- calls to `long` parameters.
+ Nearly identical compile errors afflicted recently-updated Debian
+ setups, which have been addressed by `jk/curl-easy-setopt-typefix`.
+
+ However, on macOS Git is built with different build options, which
+ uncovered more instances of `int` values that need to be cast to
+ constants, which were not covered by 6f11c42e8edc (curl: fix integer
+ constant typechecks with curl_easy_setopt(), 2025-06-04). Let's
+ explicitly convert even those remaining `int` constants in
+ `curl_easy_setopt()` calls to `long` parameters.
+
+ In addition to looking at the compile errors of the `osx-gcc` job, I
+ verified that there are no other instances of the same issue that need
+ to be handled in this manner (and that might not be caught by our CI
+ builds because of yet other build options that might skip those code
+ parts), I ran the following command and inspected all 23 results
+ manually to ensure that the fix is now actually complete:
+
+ git grep -n curl_easy_setopt |
+ grep -ve ',.*, *[A-Za-z_"&]' \
+ -e ',.*, *[-0-9]*L)' \
+ -e ',.*,.* (long)'
Signed-off-by: Johannes Schindelin <[email protected]>
## http-push.c ##
-@@ http-push.c: static char *xml_entities(const char *s)
- static void curl_setup_http_get(CURL *curl, const char *url,
- const char *custom_req)
- {
-- curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
-+ curl_easy_setopt(curl, CURLOPT_HTTPGET, 1l);
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, custom_req);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite_null);
@@ http-push.c: static void curl_setup_http(CURL *curl, const char *url,
const char *custom_req, struct buffer *buffer,
curl_write_callback write_fn)
{
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
-+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1l);
++ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_INFILE, buffer);
curl_easy_setopt(curl, CURLOPT_INFILESIZE, buffer->buf.len);
@@ http-push.c: static void curl_setup_http(CURL *curl, const char *url,
curl_easy_setopt(curl, CURLOPT_SEEKDATA, buffer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_fn);
- curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
-+ curl_easy_setopt(curl, CURLOPT_NOBODY, 0l);
++ curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, custom_req);
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
-+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1l);
++ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
}
static struct curl_slist *get_dav_token_headers(struct remote_lock *lock, enum dav_header_flag options)
## http.c ##
-@@ http.c: static CURL *get_curl_handle(void)
- die("curl_easy_init failed");
-
- if (!curl_ssl_verify) {
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0);
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0l);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0l);
- } else {
- /* Verify authenticity of the peer's certificate */
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 1);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 1l);
- /* The name in the cert must match whom we tried to connect */
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 2);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 2l);
- }
-
- if (curl_http_version) {
-@@ http.c: static CURL *get_curl_handle(void)
-
- if (http_ssl_backend && !strcmp("schannel", http_ssl_backend) &&
- !http_schannel_check_revoke) {
-- curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
-+ curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, (long)CURLSSLOPT_NO_REVOKE);
- }
-
- if (http_proactive_auth != PROACTIVE_AUTH_NONE)
-@@ http.c: static CURL *get_curl_handle(void)
- curl_low_speed_time);
- }
-
-- curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
-- curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
-+ curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20l);
-+ curl_easy_setopt(result, CURLOPT_POSTREDIR, (long)CURL_REDIR_POST_ALL);
-
- #ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR
- {
-@@ http.c: static CURL *get_curl_handle(void)
- user_agent ? user_agent : git_user_agent());
-
- if (curl_ftp_no_epsv)
-- curl_easy_setopt(result, CURLOPT_FTP_USE_EPSV, 0);
-+ curl_easy_setopt(result, CURLOPT_FTP_USE_EPSV, 0l);
-
- if (curl_ssl_try)
- curl_easy_setopt(result, CURLOPT_USE_SSL, CURLUSESSL_TRY);
-@@ http.c: static CURL *get_curl_handle(void)
-
- if (starts_with(curl_http_proxy, "socks5h"))
- curl_easy_setopt(result,
-- CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
-+ CURLOPT_PROXYTYPE, (long)CURLPROXY_SOCKS5_HOSTNAME);
- else if (starts_with(curl_http_proxy, "socks5"))
- curl_easy_setopt(result,
-- CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
-+ CURLOPT_PROXYTYPE, (long)CURLPROXY_SOCKS5);
- else if (starts_with(curl_http_proxy, "socks4a"))
- curl_easy_setopt(result,
-- CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A);
-+ CURLOPT_PROXYTYPE, (long)CURLPROXY_SOCKS4A);
- else if (starts_with(curl_http_proxy, "socks"))
- curl_easy_setopt(result,
-- CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
-+ CURLOPT_PROXYTYPE, (long)CURLPROXY_SOCKS4);
- else if (starts_with(curl_http_proxy, "https")) {
-- curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_HTTPS);
-+ curl_easy_setopt(result, CURLOPT_PROXYTYPE, (long)CURLPROXY_HTTPS);
-
- if (http_proxy_ssl_cert)
- curl_easy_setopt(result, CURLOPT_PROXY_SSLCERT, http_proxy_ssl_cert);
-@@ http.c: static CURL *get_curl_handle(void)
- }
- init_curl_proxy_auth(result);
-
-- curl_easy_setopt(result, CURLOPT_TCP_KEEPALIVE, 1);
-+ curl_easy_setopt(result, CURLOPT_TCP_KEEPALIVE, 1l);
-
- if (curl_tcp_keepidle > -1)
- curl_easy_setopt(result, CURLOPT_TCP_KEEPIDLE,
@@ http.c: struct active_request_slot *get_active_slot(void)
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, NULL);
@@ http.c: struct active_request_slot *get_active_slot(void)
- curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0);
- curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
- curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0l);
-+ curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1l);
-+ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0L);
++ curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1L);
++ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1L);
curl_easy_setopt(slot->curl, CURLOPT_RANGE, NULL);
/*
@@ http.c: struct active_request_slot *get_active_slot(void)
*/
if (http_follow_config == HTTP_FOLLOW_ALWAYS)
- curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1L);
else
- curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 0);
-+ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 0l);
++ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 0L);
curl_easy_setopt(slot->curl, CURLOPT_IPRESOLVE, git_curl_ipresolve);
curl_easy_setopt(slot->curl, CURLOPT_HTTPAUTH, http_auth_methods);
@@ http.c: static int http_request(const char *url,
slot = get_active_slot();
- curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1L);
if (!result) {
- curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 1L);
} else {
- curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
-+ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0l);
++ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0L);
curl_easy_setopt(slot->curl, CURLOPT_WRITEDATA, result);
if (target == HTTP_REQUEST_FILE) {
@@ http.c: static int http_request(const char *url,
if (options && options->initial_request &&
http_follow_config == HTTP_FOLLOW_INITIAL)
- curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1L);
headers = curl_slist_append(headers, buf.buf);
@@ http.c: static int http_request(const char *url,
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
- curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
-+ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0l);
++ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0L);
ret = run_one_slot(slot, &results);
@@ http.c: struct http_object_request *new_http_object_request(const char *base_url
curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEDATA, freq);
- curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0);
-+ curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0l);
++ curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0L);
curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file);
curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr);
curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url);
- ## imap-send.c ##
-@@ imap-send.c: static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)
-
- curl_easy_setopt(curl, CURLOPT_URL, path.buf);
- strbuf_release(&path);
-- curl_easy_setopt(curl, CURLOPT_PORT, srvc->port);
-+ curl_easy_setopt(curl, CURLOPT_PORT, (long)srvc->port);
-
- if (srvc->auth_method) {
- struct strbuf auth = STRBUF_INIT;
-@@ imap-send.c: static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)
- if (!srvc->use_ssl)
- curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY);
-
-- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, srvc->ssl_verify);
-- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, srvc->ssl_verify);
-+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, (long)srvc->ssl_verify);
-+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, (long)srvc->ssl_verify);
-
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread_buffer);
-
-
## remote-curl.c ##
-@@ remote-curl.c: static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
- headers = curl_slist_append(headers, rpc->hdr_content_type);
- headers = curl_slist_append(headers, rpc->hdr_accept);
-
-- curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
-- curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0l);
-+ curl_easy_setopt(slot->curl, CURLOPT_POST, 1l);
- curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
- curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL);
- curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000");
-- curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4);
-+ curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4l);
- curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
- curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
- curl_easy_setopt(slot->curl, CURLOPT_WRITEDATA, &buf);
@@ remote-curl.c: retry:
slot = get_active_slot();
- curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
- curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
-+ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0l);
-+ curl_easy_setopt(slot->curl, CURLOPT_POST, 1l);
++ curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0L);
++ curl_easy_setopt(slot->curl, CURLOPT_POST, 1L);
curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
@@ remote-curl.c: retry:
memset(&rpc_in_data.pktline_state, 0, sizeof(rpc_in_data.pktline_state));
curl_easy_setopt(slot->curl, CURLOPT_WRITEDATA, &rpc_in_data);
- curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
-+ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0l);
++ curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0L);
rpc->any_written = 0;Signature · 1 line
gitgitgadget
PATCH v2 1/4 curl: fix integer constant typechecks with curl_easy_setopt()
From: Jeff King <[email protected]>
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".
--- http-push.c | 2 +- http.c | 14 +++++++------- remote-curl.c | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-)
http-push.c +1 -1
@@ -195,7 +195,7 @@ static char *xml_entities(const char *s)static void curl_setup_http_get (CURL *curl,const char *url,const char *custom_req) { -curl_easy_setopt (curl,CURLOPT_HTTPGET ,1 ); +curl_easy_setopt (curl,CURLOPT_HTTPGET ,1L );curl_easy_setopt (curl,CURLOPT_URL , url);curl_easy_setopt (curl,CURLOPT_CUSTOMREQUEST , custom_req);curl_easy_setopt (curl,CURLOPT_WRITEFUNCTION , fwrite_null);
http.c +7 -7
@@ -1019,13 +1019,13 @@ static CURL *get_curl_handle(void)die ("curl_easy_init failed" );if (!curl_ssl_verify) { -curl_easy_setopt (result,CURLOPT_SSL_VERIFYPEER ,0 ); -curl_easy_setopt (result,CURLOPT_SSL_VERIFYHOST ,0 ); +curl_easy_setopt (result,CURLOPT_SSL_VERIFYPEER ,0L ); +curl_easy_setopt (result,CURLOPT_SSL_VERIFYHOST ,0L ); }else {/* Verify authenticity of the peer's certificate */ -curl_easy_setopt (result,CURLOPT_SSL_VERIFYPEER ,1 ); +curl_easy_setopt (result,CURLOPT_SSL_VERIFYPEER ,1L );/* The name in the cert must match whom we tried to connect */ -curl_easy_setopt (result,CURLOPT_SSL_VERIFYHOST ,2 ); +curl_easy_setopt (result,CURLOPT_SSL_VERIFYHOST ,2L ); }if (curl_http_version) {
@@ -1117,7 +1117,7 @@ static CURL *get_curl_handle(void) curl_low_speed_time); } -curl_easy_setopt (result,CURLOPT_MAXREDIRS ,20 ); +curl_easy_setopt (result,CURLOPT_MAXREDIRS ,20L );curl_easy_setopt (result,CURLOPT_POSTREDIR ,CURL_REDIR_POST_ALL );#ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR
@@ -1151,7 +1151,7 @@ static CURL *get_curl_handle(void) user_agent ? user_agent : git_user_agent());if (curl_ftp_no_epsv) -curl_easy_setopt (result,CURLOPT_FTP_USE_EPSV ,0 ); +curl_easy_setopt (result,CURLOPT_FTP_USE_EPSV ,0L );if (curl_ssl_try)curl_easy_setopt (result,CURLOPT_USE_SSL ,CURLUSESSL_TRY );
@@ -1254,7 +1254,7 @@ static CURL *get_curl_handle(void) }init_curl_proxy_auth (result); -curl_easy_setopt (result,CURLOPT_TCP_KEEPALIVE ,1 ); +curl_easy_setopt (result,CURLOPT_TCP_KEEPALIVE ,1L );if (curl_tcp_keepidle >-1 ) 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) headers =curl_slist_append (headers, rpc->hdr_content_type); headers =curl_slist_append (headers, rpc->hdr_accept); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1L );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDS ,"0000" ); -curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,4 ); +curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,4L );curl_easy_setopt (slot->curl,CURLOPT_HTTPHEADER , headers);curl_easy_setopt (slot->curl,CURLOPT_WRITEFUNCTION , fwrite_buffer);curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , &buf);
Signature · 1 line
gitgitgadget
PATCH v2 2/4 curl: fix integer variable typechecks with curl_easy_setopt()
In reply to Johannes Schindelin via GitGitGadgetFrom: Jeff King <[email protected]>
As discussed in the previous commit, we should be passing long integers, not regular ones, to curl_easy_setopt(), and compiling against curl 8.14 loudly complains if we don't.
That patch fixed integer constants by adding an "L". This one deals with actual variables.
Arguably these variables could just be declared as "long" in the first place. But it's actually kind of awkward due to other code which uses them:
- port is conceptually a short, and we even call htons() on it (though weirdly it is defined as a regular int).
- ssl_verify is conceptually a bool, and we assign to it from
git_config_bool().
So I think we could probably switch these out for longs without hurting anything, but it just feels a bit weird. Doubly so because if you don't set USE_CURL_FOR_IMAP_SEND set, then the current types are fine!
So let's just cast these to longs in the curl calls, which makes what's going on obvious. There aren't that many spots to modify (and as you can see from the context, we already have some similar casts).
--- imap-send.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
imap-send.c +3 -3
@@ -1420,7 +1420,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)curl_easy_setopt (curl,CURLOPT_URL , path.buf);strbuf_release (&path); -curl_easy_setopt (curl,CURLOPT_PORT , srvc->port); +curl_easy_setopt (curl,CURLOPT_PORT , (long )srvc->port);if (srvc->auth_method) {struct strbuf auth =STRBUF_INIT ;
@@ -1433,8 +1433,8 @@ static CURL *setup_curl(struct imap_server_conf *srvc, struct credential *cred)if (!srvc->use_ssl)curl_easy_setopt (curl,CURLOPT_USE_SSL , (long )CURLUSESSL_TRY ); -curl_easy_setopt (curl,CURLOPT_SSL_VERIFYPEER , srvc->ssl_verify); -curl_easy_setopt (curl,CURLOPT_SSL_VERIFYHOST , srvc->ssl_verify); +curl_easy_setopt (curl,CURLOPT_SSL_VERIFYPEER , (long )srvc->ssl_verify); +curl_easy_setopt (curl,CURLOPT_SSL_VERIFYHOST , (long )srvc->ssl_verify);curl_easy_setopt (curl,CURLOPT_READFUNCTION , fread_buffer);
Signature · 1 line
gitgitgadget
PATCH v2 3/4 curl: fix symbolic constant typechecks with curl_easy_setopt()
In reply to Johannes Schindelin via GitGitGadgetFrom: Jeff King <[email protected]>
As with the previous two commits, we should be passing long integers, not regular ones, to curl_easy_setopt(), and compiling against curl 8.14 loudly complains if we don't.
This patch catches the remaining cases, which are ones where we pass curl's own symbolic constants. We'll cast them to long manually in each call.
It seems kind of weird to me that curl doesn't define these constants as longs, since the point of them is to pass to curl_easy_setopt(). But in the curl documentation and examples, they clearly show casting them as part of the setopt calls. It may be that there is some reason not to push the type into the macro, like backwards compatibility. I didn't dig, as it doesn't really matter: we have to follow what existing curl versions ask for anyway.
--- http.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
http.c +7 -7
@@ -1057,7 +1057,7 @@ static CURL *get_curl_handle(void)if (http_ssl_backend && !strcmp ("schannel" , http_ssl_backend) && !http_schannel_check_revoke) { -curl_easy_setopt (result,CURLOPT_SSL_OPTIONS ,CURLSSLOPT_NO_REVOKE ); +curl_easy_setopt (result,CURLOPT_SSL_OPTIONS , (long )CURLSSLOPT_NO_REVOKE ); }if (http_proactive_auth !=PROACTIVE_AUTH_NONE )
@@ -1118,7 +1118,7 @@ static CURL *get_curl_handle(void) }curl_easy_setopt (result,CURLOPT_MAXREDIRS ,20L ); -curl_easy_setopt (result,CURLOPT_POSTREDIR ,CURL_REDIR_POST_ALL ); +curl_easy_setopt (result,CURLOPT_POSTREDIR , (long )CURL_REDIR_POST_ALL );#ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR {
@@ -1193,18 +1193,18 @@ static CURL *get_curl_handle(void)if (starts_with (curl_http_proxy,"socks5h" ))curl_easy_setopt (result, -CURLOPT_PROXYTYPE ,CURLPROXY_SOCKS5_HOSTNAME ); +CURLOPT_PROXYTYPE , (long )CURLPROXY_SOCKS5_HOSTNAME );else if (starts_with (curl_http_proxy,"socks5" ))curl_easy_setopt (result, -CURLOPT_PROXYTYPE ,CURLPROXY_SOCKS5 ); +CURLOPT_PROXYTYPE , (long )CURLPROXY_SOCKS5 );else if (starts_with (curl_http_proxy,"socks4a" ))curl_easy_setopt (result, -CURLOPT_PROXYTYPE ,CURLPROXY_SOCKS4A ); +CURLOPT_PROXYTYPE , (long )CURLPROXY_SOCKS4A );else if (starts_with (curl_http_proxy,"socks" ))curl_easy_setopt (result, -CURLOPT_PROXYTYPE ,CURLPROXY_SOCKS4 ); +CURLOPT_PROXYTYPE , (long )CURLPROXY_SOCKS4 );else if (starts_with (curl_http_proxy,"https" )) { -curl_easy_setopt (result,CURLOPT_PROXYTYPE ,CURLPROXY_HTTPS ); +curl_easy_setopt (result,CURLOPT_PROXYTYPE , (long )CURLPROXY_HTTPS );if (http_proxy_ssl_cert)curl_easy_setopt (result,CURLOPT_PROXY_SSLCERT , http_proxy_ssl_cert);
Signature · 1 line
gitgitgadget
PATCH v2 4/4 curl: pass `long` values where expected
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
As of Homebrew's update to cURL v8.14.0, there are new compile errors to be observed in the osx-gcc job of Git's CI builds:
In file included from http.h:8,
from imap-send.c:36:
In function 'setup_curl',
inlined from 'curl_append_msgs_to_imap' at imap-send.c:1460:9,
inlined from 'cmd_main' at imap-send.c:1581:9:
/usr/local/Cellar/curl/8.14.0/include/curl/typecheck-gcc.h:50:15: error: call to '_curl_easy_setopt_err_long' declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
50 | _curl_easy_setopt_err_long(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/Cellar/curl/8.14.0/include/curl/curl.h:54:7: note: in definition of macro 'CURL_IGNORE_DEPRECATION'
54 | statements \
| ^~~~~~~~~~
imap-send.c:1423:9: note: in expansion of macro 'curl_easy_setopt'
1423 | curl_easy_setopt(curl, CURLOPT_PORT, srvc->port);
| ^~~~~~~~~~~~~~~~[... many more instances of nearly identical warnings...]
See for example this CI workflow run:
https://github.com/git/git/actions/runs/15454602308/job/43504278284#step:4:307
The most likely explanation is the entry "typecheck-gcc.h: fix the typechecks" in cURL's release notes (https://curl.se/ch/8.14.0.html).
Nearly identical compile errors afflicted recently-updated Debian setups, which have been addressed by jk/curl-easy-setopt-typefix.
However, on macOS Git is built with different build options, which uncovered more instances of int values that need to be cast to constants, which were not covered by 6f11c42e8edc (curl: fix integer constant typechecks with curl_easy_setopt(), 2025-06-04). Let's explicitly convert even those remaining int constants in curl_easy_setopt() calls to long parameters.
In addition to looking at the compile errors of the osx-gcc job, I verified that there are no other instances of the same issue that need to be handled in this manner (and that might not be caught by our CI builds because of yet other build options that might skip those code parts), I ran the following command and inspected all 23 results manually to ensure that the fix is now actually complete:
git grep -n curl_easy_setopt |
grep -ve ',.*, *[A-Za-z_"&]' \
-e ',.*, *[-0-9]*L)' \
-e ',.*,.* (long)'--- http-push.c | 6 +++--- http.c | 22 +++++++++++----------- remote-curl.c | 6 +++--- 3 files changed, 17 insertions(+), 17 deletions(-)
http-push.c +3 -3
@@ -205,7 +205,7 @@ static void curl_setup_http(CURL *curl, const char *url, const char *custom_req, struct buffer *buffer, curl_write_callback write_fn) { - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);curl_easy_setopt (curl,CURLOPT_URL , url);curl_easy_setopt (curl,CURLOPT_INFILE , buffer);curl_easy_setopt (curl,CURLOPT_INFILESIZE , buffer->buf.len);
@@ -213,9 +213,9 @@ static void curl_setup_http(CURL *curl, const char *url,curl_easy_setopt (curl,CURLOPT_SEEKFUNCTION , seek_buffer);curl_easy_setopt (curl,CURLOPT_SEEKDATA , buffer);curl_easy_setopt (curl,CURLOPT_WRITEFUNCTION , write_fn); -curl_easy_setopt (curl,CURLOPT_NOBODY ,0 ); +curl_easy_setopt (curl,CURLOPT_NOBODY ,0L );curl_easy_setopt (curl,CURLOPT_CUSTOMREQUEST , custom_req); -curl_easy_setopt (curl,CURLOPT_UPLOAD ,1 ); +curl_easy_setopt (curl,CURLOPT_UPLOAD ,1L ); }static struct curl_slist *get_dav_token_headers (struct remote_lock *lock,enum dav_header_flag options)
http.c +11 -11
@@ -1540,9 +1540,9 @@ struct active_request_slot *get_active_slot(void)curl_easy_setopt (slot->curl,CURLOPT_WRITEFUNCTION ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDS ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,-1L ); -curl_easy_setopt (slot->curl,CURLOPT_UPLOAD ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1 ); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_UPLOAD ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1L ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,1L );curl_easy_setopt (slot->curl,CURLOPT_RANGE ,NULL );/*
@@ -1551,9 +1551,9 @@ struct active_request_slot *get_active_slot(void)* HTTP_FOLLOW_* cases themselves. */ if (http_follow_config ==HTTP_FOLLOW_ALWAYS ) -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1L );else -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,0L );curl_easy_setopt (slot->curl,CURLOPT_IPRESOLVE , git_curl_ipresolve);curl_easy_setopt (slot->curl,CURLOPT_HTTPAUTH , http_auth_methods);
@@ -2120,12 +2120,12 @@ static int http_request(const char *url,int ret; slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1L );if (!result) { -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,1L ); }else { -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L );curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , result);if (target ==HTTP_REQUEST_FILE ) {
@@ -2151,7 +2151,7 @@ static int http_request(const char *url,strbuf_addstr (&buf," no-cache" );if (options && options->initial_request && http_follow_config ==HTTP_FOLLOW_INITIAL ) -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1L ); headers =curl_slist_append (headers, buf.buf);
@@ -2170,7 +2170,7 @@ static int http_request(const char *url,curl_easy_setopt (slot->curl,CURLOPT_URL , url);curl_easy_setopt (slot->curl,CURLOPT_HTTPHEADER , headers);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" ); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0L ); ret =run_one_slot (slot, &results);
@@ -2750,7 +2750,7 @@ struct http_object_request *new_http_object_request(const char *base_url, freq->headers =object_request_headers ();curl_easy_setopt (freq->slot->curl,CURLOPT_WRITEDATA , freq); -curl_easy_setopt (freq->slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (freq->slot->curl,CURLOPT_FAILONERROR ,0L );curl_easy_setopt (freq->slot->curl,CURLOPT_WRITEFUNCTION , fwrite_sha1_file);curl_easy_setopt (freq->slot->curl,CURLOPT_ERRORBUFFER , freq->errorstr);curl_easy_setopt (freq->slot->curl,CURLOPT_URL , freq->url);
remote-curl.c +3 -3
@@ -970,8 +970,8 @@ retry: slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1L );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" );
@@ -1058,7 +1058,7 @@ retry: rpc_in_data.check_pktline = stateless_connect;memset (&rpc_in_data.pktline_state,0 ,sizeof (rpc_in_data.pktline_state));curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , &rpc_in_data); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0L ); rpc->any_written =0 ;
Signature · 1 line
gitgitgadget
Quoted 9 lines · Johannes Schindelin via GitGitGadget
Nearly identical compile errors afflicted recently-updated Debian setups, which have been addressed by
jk/curl-easy-setopt-typefix.However, on macOS Git is built with different build options, which uncovered more instances of
intvalues that need to be cast to constants, which were not covered by6f11c42e8edc(curl: fix integer constant typechecks withcurl_easy_setopt(), 2025-06-04). Let's explicitly convert even those remainingintconstants incurl_easy_setopt()calls tolongparameters.
What different build options? The extra fixes are in code that is compiled on all platforms. E.g.:
remote-curl.c retry: · line 976
Quoted 12 lines
remote-curl.c +2
-2@@ -970,8 +970,8 @@ retry: slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1L );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" );
So I think the root cause of the difference remains a mystery.
Curiously, if I build libcurl from source and link against it on my Debian system, I get all of the errors (including the ones you're fixing here). But with the exact same compile options (modulo pointing CURL_CONFIG at the right spot), building against the Debian-packaged libcurl is OK. Weird.
Quoted 11 lines
In addition to looking at the compile errors of the
osx-gccjob, I verified that there are no other instances of the same issue that need to be handled in this manner (and that might not be caught by our CI builds because of yet other build options that might skip those code parts), I ran the following command and inspected all 23 results manually to ensure that the fix is now actually complete:git grep -n curl_easy_setopt | grep -ve ',.*, *[A-Za-z_"&]' \ -e ',.*, *[-0-9]*L)' \ -e ',.*,.* (long)'
I don't think that's sufficient for a full audit, because the first "grep -v" regex is removing variable names and symbolic constants, which might also need to be cast to long (i.e., my patches 2 and 3).
But as your patch fixes the exact set that I also needed when building against my custom-built libcurl, I'm content to say we have spent enough time digging. If there is some platform or makefile knob combination that triggers one we missed, then curl's type-checker will catch it and we can fix it then.
-Peff
Quoted 5 lines · Jeff King
But as your patch fixes the exact set that I also needed when building against my custom-built libcurl, I'm content to say we have spent enough time digging. If there is some platform or makefile knob combination that triggers one we missed, then curl's type-checker will catch it and we can fix it then.
Yeah, thanks, both.
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 19 lines · writes:
From: Johannes Schindelin <[email protected]>
As of Homebrew's update to cURL v8.14.0, there are new compile errors to be observed in the
osx-gccjob of Git's CI builds:In file included from http.h:8,
from imap-send.c:36: In function 'setup_curl', inlined from 'curl_append_msgs_to_imap' at imap-send.c:1460:9, inlined from 'cmd_main' at imap-send.c:1581:9: /usr/local/Cellar/curl/8.14.0/include/curl/typecheck-gcc.h:50:15: error: call to '_curl_easy_setopt_err_long' declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning] 50 | _curl_easy_setopt_err_long(); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/local/Cellar/curl/8.14.0/include/curl/curl.h:54:7: note: in definition of macro 'CURL_IGNORE_DEPRECATION' 54 | statements \ | ^~~~~~~~~~ imap-send.c:1423:9: note: in expansion of macro 'curl_easy_setopt' 1423 | curl_easy_setopt(curl, CURLOPT_PORT, srvc->port); | ^~~~~~~~~~~~~~~~
Quoted 7 lines
[... many more instances of nearly identical warnings...]
See for example this CI workflow run:
https://github.com/git/git/actions/runs/15454602308/job/43504278284#step:4:307The most likely explanation is the entry "
typecheck-gcc.h: fix the typechecks" in cURL's release notes (https://curl.se/ch/8.14.0.html).
All of the above were good descriptions in a standalone patch.
However.
The first two lines that mention that osx-gcc job was broken are valuable introduction to flow into "Nearly identical ... Debian", but except that, but as part of a series it is probably a tad too verbose.
Quoted 9 lines
Nearly identical compile errors afflicted recently-updated Debian setups, which have been addressed by
jk/curl-easy-setopt-typefix.However, on macOS Git is built with different build options, which uncovered more instances of
intvalues that need to be cast to constants, which were not covered by6f11c42e8edc(curl: fix integer constant typechecks withcurl_easy_setopt(), 2025-06-04). Let's explicitly convert even those remainingintconstants incurl_easy_setopt()calls tolongparameters.
It is a but curious what build option differences caused it, as I do not think any "#ifdef DARWIN" is involved.
By the way, I notice that we refer to 6f11c42e (curl: fix integer constant typechecks with curl_easy_setopt(), 2025-06-04), so I won't be requeueing Peff's patches. I locally applied these four patches and the result of applying the first three on the same base was identical to what I already had in jk/curl-easy-setopt-typefix topic (you didn't have to resend them---which was unnecessary confusing).
Quoted 11 lines
In addition to looking at the compile errors of the
osx-gccjob, I verified that there are no other instances of the same issue that need to be handled in this manner (and that might not be caught by our CI builds because of yet other build options that might skip those code parts), I ran the following command and inspected all 23 results manually to ensure that the fix is now actually complete:git grep -n curl_easy_setopt | grep -ve ',.*, *[A-Za-z_"&]' \ -e ',.*, *[-0-9]*L)' \ -e ',.*,.* (long)'
Thanks for being careful. But I think it is probably counter productive to exclud the first pattern (presumably to catch CURL* and other symbols), as the symbols defined by the library headers still require to be cast to long; see:
https://lore.kernel.org/git/[email protected]/
Anyway, the change this patch makes matches what you sent as a "these still remain" yesterday, so I understand that your inspecting the 23 results manually did not find any "ah, this too needs updated but was missing from the one we saw yesterday", which is a wonderful news.
With this patch replaced (but not 3 from Peff), I'll redo the 'next' (thank me, whatever your deity is, and your good luck that I haven't pushed it out, even though I did it with yesterday's material late last night) and push the result out, but it won't be a while (even though we already know the tree objects should be the same), as I want to see if there are other urgent changes that have to go to 'next' before doing so.
Thanks.
Quoted 128 lines
Signed-off-by Johannes Schindelin <[email protected]>--- http-push.c | 6 +++--- http.c | 22 +++++++++++----------- remote-curl.c | 6 +++--- 3 files changed, 17 insertions(+), 17 deletions(-)http-push.c +3
-3@@ -205,7 +205,7 @@ static void curl_setup_http(CURL *curl, const char *url, const char *custom_req, struct buffer *buffer, curl_write_callback write_fn) { - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);curl_easy_setopt (curl,CURLOPT_URL , url);curl_easy_setopt (curl,CURLOPT_INFILE , buffer);curl_easy_setopt (curl,CURLOPT_INFILESIZE , buffer->buf.len);@@ -213,9 +213,9 @@ static void curl_setup_http(CURL *curl, const char *url,curl_easy_setopt (curl,CURLOPT_SEEKFUNCTION , seek_buffer);curl_easy_setopt (curl,CURLOPT_SEEKDATA , buffer);curl_easy_setopt (curl,CURLOPT_WRITEFUNCTION , write_fn); -curl_easy_setopt (curl,CURLOPT_NOBODY ,0 ); +curl_easy_setopt (curl,CURLOPT_NOBODY ,0L );curl_easy_setopt (curl,CURLOPT_CUSTOMREQUEST , custom_req); -curl_easy_setopt (curl,CURLOPT_UPLOAD ,1 ); +curl_easy_setopt (curl,CURLOPT_UPLOAD ,1L ); }static struct curl_slist *get_dav_token_headers (struct remote_lock *lock,enum dav_header_flag options)http.c +11
-11@@ -1540,9 +1540,9 @@ struct active_request_slot *get_active_slot(void)curl_easy_setopt (slot->curl,CURLOPT_WRITEFUNCTION ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDS ,NULL );curl_easy_setopt (slot->curl,CURLOPT_POSTFIELDSIZE ,-1L ); -curl_easy_setopt (slot->curl,CURLOPT_UPLOAD ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1 ); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_UPLOAD ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1L ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,1L );curl_easy_setopt (slot->curl,CURLOPT_RANGE ,NULL );/* @@ -1551,9 +1551,9 @@ struct active_request_slot *get_active_slot(void)* HTTP_FOLLOW_* cases themselves. */ if (http_follow_config ==HTTP_FOLLOW_ALWAYS ) -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1L );else -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,0L );curl_easy_setopt (slot->curl,CURLOPT_IPRESOLVE , git_curl_ipresolve);curl_easy_setopt (slot->curl,CURLOPT_HTTPAUTH , http_auth_methods);@@ -2120,12 +2120,12 @@ static int http_request(const char *url,int ret; slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_HTTPGET ,1L );if (!result) { -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,1L ); }else { -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L );curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , result);if (target ==HTTP_REQUEST_FILE ) {@@ -2151,7 +2151,7 @@ static int http_request(const char *url,strbuf_addstr (&buf," no-cache" );if (options && options->initial_request && http_follow_config ==HTTP_FOLLOW_INITIAL ) -curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_FOLLOWLOCATION ,1L ); headers =curl_slist_append (headers, buf.buf);@@ -2170,7 +2170,7 @@ static int http_request(const char *url,curl_easy_setopt (slot->curl,CURLOPT_URL , url);curl_easy_setopt (slot->curl,CURLOPT_HTTPHEADER , headers);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" ); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0L ); ret =run_one_slot (slot, &results);@@ -2750,7 +2750,7 @@ struct http_object_request *new_http_object_request(const char *base_url, freq->headers =object_request_headers ();curl_easy_setopt (freq->slot->curl,CURLOPT_WRITEDATA , freq); -curl_easy_setopt (freq->slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (freq->slot->curl,CURLOPT_FAILONERROR ,0L );curl_easy_setopt (freq->slot->curl,CURLOPT_WRITEFUNCTION , fwrite_sha1_file);curl_easy_setopt (freq->slot->curl,CURLOPT_ERRORBUFFER , freq->errorstr);curl_easy_setopt (freq->slot->curl,CURLOPT_URL , freq->url);remote-curl.c +3
-3@@ -970,8 +970,8 @@ retry: slot =get_active_slot (); -curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0 ); -curl_easy_setopt (slot->curl,CURLOPT_POST ,1 ); +curl_easy_setopt (slot->curl,CURLOPT_NOBODY ,0L ); +curl_easy_setopt (slot->curl,CURLOPT_POST ,1L );curl_easy_setopt (slot->curl,CURLOPT_URL , rpc->service_url);curl_easy_setopt (slot->curl,CURLOPT_ENCODING ,"" );@@ -1058,7 +1058,7 @@ retry: rpc_in_data.check_pktline = stateless_connect;memset (&rpc_in_data.pktline_state,0 ,sizeof (rpc_in_data.pktline_state));curl_easy_setopt (slot->curl,CURLOPT_WRITEDATA , &rpc_in_data); -curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0 ); +curl_easy_setopt (slot->curl,CURLOPT_FAILONERROR ,0L ); rpc->any_written =0 ;
Re: [PATCH v2 0/4] curl: pass long values where expected
In reply to Johannes Schindelin via GitGitGadgetQuoted 9 lines · Johannes Schindelin via GitGitGadget
## http.c ##
-@@ http.c: static CURL *get_curl_handle(void)
- die("curl_easy_init failed");
-
- if (!curl_ssl_verify) {
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0);
-- curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0l);
-+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0l);Maybe I don’t understand range-diffs enough but it looked like this was using 0l instead of 0L.[1] However the patches do use <num>L instead of <num>l throughout. Which I like
† 1: Or rather I don’t understand that this is showing 0l
Re: [PATCH v2 0/4] curl: pass long values where expected
Quoted 12 lines · Kristoffer Haugsbakk
Quoted 9 lines · Johannes Schindelin via GitGitGadget
## http.c ## -@@ http.c: static CURL *get_curl_handle(void) - die("curl_easy_init failed"); - - if (!curl_ssl_verify) { -- curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0); -- curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0); -+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0l); -+ curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0l);
Quoted 5 lines
Maybe I don’t understand range-diffs enough but it looked like this was using
0linstead of0L.[1] However the patches do use<num>Linstead of<num>lthroughout. Which I like† 1: Or rather I don’t understand that this is showing
0l
You can read "--" as "we no longer remove this" and "-+" as "we no longer add this". In fact, this whole section begins with "-" (in the outer diff) and we can read this as "we no longer touch this at all."
Where, crucially, it's "we no longer touch this *in this patch*". Patch 1/4 in this v2 does change this from "0" to "0L" and this updated patch 4/4 then leaves this spot as is. Unlike in v1, when this was a much bigger patch that touched this spot and many others.
Martin
Re: [PATCH v2 0/4] curl: pass long values where expected
Quoted 6 lines · Martin Ågren
Quoted 5 lines
Maybe I don’t understand range-diffs enough but it looked like this was using
0linstead of0L.[1] However the patches do use<num>Linstead of<num>lthroughout. Which I like† 1: Or rather I don’t understand that this is showing
0l
Quoted 8 lines
You can read "--" as "we no longer remove this" and "-+" as "we no longer add this". In fact, this whole section begins with "-" (in the outer diff) and we can read this as "we no longer touch this at all."
Where, crucially, it's "we no longer touch this *in this patch*". Patch 1/4 in this v2 does change this from "0" to "0L" and this updated patch 4/4 then leaves this spot as is. Unlike in v1, when this was a much bigger patch that touched this spot and many others.
Aha, thanks!
Signature · 1 line
Kristoffer Haugsbakk