Skip to content

Commit bd6d3de

Browse files
gitsterdscho
authored andcommitted
Merge branch 'jk/curl-avoid-deprecated-api'
Deal with a few deprecation warning from cURL library. * jk/curl-avoid-deprecated-api: http: support CURLOPT_PROTOCOLS_STR http: prefer CURLOPT_SEEKFUNCTION to CURLOPT_IOCTLFUNCTION http-push: prefer CURLOPT_UPLOAD to CURLOPT_PUT
2 parents f39fe8f + f44e6a2 commit bd6d3de

File tree

6 files changed

+81
-44
lines changed

6 files changed

+81
-44
lines changed

INSTALL

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ Issues of note:
144144
not need that functionality, use NO_CURL to build without
145145
it.
146146

147-
Git requires version "7.19.4" or later of "libcurl" to build
147+
Git requires version "7.19.5" or later of "libcurl" to build
148148
without NO_CURL. This version requirement may be bumped in
149149
the future.
150150

git-curl-compat.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,12 @@
126126
#define GIT_CURL_HAVE_CURLSSLSET_NO_BACKENDS
127127
#endif
128128

129+
/**
130+
* CURLOPT_PROTOCOLS_STR and CURLOPT_REDIR_PROTOCOLS_STR were added in 7.85.0,
131+
* released in August 2022.
132+
*/
133+
#if LIBCURL_VERSION_NUM >= 0x075500
134+
#define GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR 1
135+
#endif
136+
129137
#endif

http-push.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,13 @@ static void curl_setup_http(CURL *curl, const char *url,
198198
const char *custom_req, struct buffer *buffer,
199199
curl_write_callback write_fn)
200200
{
201-
curl_easy_setopt(curl, CURLOPT_PUT, 1);
201+
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
202202
curl_easy_setopt(curl, CURLOPT_URL, url);
203203
curl_easy_setopt(curl, CURLOPT_INFILE, buffer);
204204
curl_easy_setopt(curl, CURLOPT_INFILESIZE, buffer->buf.len);
205205
curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread_buffer);
206-
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
207-
curl_easy_setopt(curl, CURLOPT_IOCTLDATA, buffer);
206+
curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION, seek_buffer);
207+
curl_easy_setopt(curl, CURLOPT_SEEKDATA, buffer);
208208
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_fn);
209209
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
210210
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, custom_req);

http.c

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -155,21 +155,19 @@ size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
155155
return size / eltsize;
156156
}
157157

158-
curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp)
158+
int seek_buffer(void *clientp, curl_off_t offset, int origin)
159159
{
160160
struct buffer *buffer = clientp;
161161

162-
switch (cmd) {
163-
case CURLIOCMD_NOP:
164-
return CURLIOE_OK;
165-
166-
case CURLIOCMD_RESTARTREAD:
167-
buffer->posn = 0;
168-
return CURLIOE_OK;
169-
170-
default:
171-
return CURLIOE_UNKNOWNCMD;
162+
if (origin != SEEK_SET)
163+
BUG("seek_buffer only handles SEEK_SET");
164+
if (offset < 0 || offset >= buffer->buf.len) {
165+
error("curl seek would be outside of buffer");
166+
return CURL_SEEKFUNC_FAIL;
172167
}
168+
169+
buffer->posn = offset;
170+
return CURL_SEEKFUNC_OK;
173171
}
174172

175173
size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
@@ -717,20 +715,37 @@ void setup_curl_trace(CURL *handle)
717715
curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL);
718716
}
719717

720-
static long get_curl_allowed_protocols(int from_user)
718+
static void proto_list_append(struct strbuf *list, const char *proto)
721719
{
722-
long allowed_protocols = 0;
720+
if (!list)
721+
return;
722+
if (list->len)
723+
strbuf_addch(list, ',');
724+
strbuf_addstr(list, proto);
725+
}
723726

724-
if (is_transport_allowed("http", from_user))
725-
allowed_protocols |= CURLPROTO_HTTP;
726-
if (is_transport_allowed("https", from_user))
727-
allowed_protocols |= CURLPROTO_HTTPS;
728-
if (is_transport_allowed("ftp", from_user))
729-
allowed_protocols |= CURLPROTO_FTP;
730-
if (is_transport_allowed("ftps", from_user))
731-
allowed_protocols |= CURLPROTO_FTPS;
727+
static long get_curl_allowed_protocols(int from_user, struct strbuf *list)
728+
{
729+
long bits = 0;
732730

733-
return allowed_protocols;
731+
if (is_transport_allowed("http", from_user)) {
732+
bits |= CURLPROTO_HTTP;
733+
proto_list_append(list, "http");
734+
}
735+
if (is_transport_allowed("https", from_user)) {
736+
bits |= CURLPROTO_HTTPS;
737+
proto_list_append(list, "https");
738+
}
739+
if (is_transport_allowed("ftp", from_user)) {
740+
bits |= CURLPROTO_FTP;
741+
proto_list_append(list, "ftp");
742+
}
743+
if (is_transport_allowed("ftps", from_user)) {
744+
bits |= CURLPROTO_FTPS;
745+
proto_list_append(list, "ftps");
746+
}
747+
748+
return bits;
734749
}
735750

736751
#ifdef GIT_CURL_HAVE_CURL_HTTP_VERSION_2
@@ -874,10 +889,26 @@ static CURL *get_curl_handle(void)
874889

875890
curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
876891
curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
892+
893+
#ifdef GIT_CURL_HAVE_CURLOPT_PROTOCOLS_STR
894+
{
895+
struct strbuf buf = STRBUF_INIT;
896+
897+
get_curl_allowed_protocols(0, &buf);
898+
curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS_STR, buf.buf);
899+
strbuf_reset(&buf);
900+
901+
get_curl_allowed_protocols(-1, &buf);
902+
curl_easy_setopt(result, CURLOPT_PROTOCOLS_STR, buf.buf);
903+
strbuf_release(&buf);
904+
}
905+
#else
877906
curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS,
878-
get_curl_allowed_protocols(0));
907+
get_curl_allowed_protocols(0, NULL));
879908
curl_easy_setopt(result, CURLOPT_PROTOCOLS,
880-
get_curl_allowed_protocols(-1));
909+
get_curl_allowed_protocols(-1, NULL));
910+
#endif
911+
881912
if (getenv("GIT_CURL_VERBOSE"))
882913
http_trace_curl_no_data();
883914
setup_curl_trace(result);

http.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct buffer {
4040
size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
4141
size_t fwrite_buffer(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
4242
size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf);
43-
curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp);
43+
int seek_buffer(void *clientp, curl_off_t offset, int origin);
4444

4545
/* Slot lifecycle functions */
4646
struct active_request_slot *get_active_slot(void);

remote-curl.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -710,25 +710,23 @@ static size_t rpc_out(void *ptr, size_t eltsize,
710710
return avail;
711711
}
712712

713-
static curlioerr rpc_ioctl(CURL *handle, int cmd, void *clientp)
713+
static int rpc_seek(void *clientp, curl_off_t offset, int origin)
714714
{
715715
struct rpc_state *rpc = clientp;
716716

717-
switch (cmd) {
718-
case CURLIOCMD_NOP:
719-
return CURLIOE_OK;
717+
if (origin != SEEK_SET)
718+
BUG("rpc_seek only handles SEEK_SET, not %d", origin);
720719

721-
case CURLIOCMD_RESTARTREAD:
722-
if (rpc->initial_buffer) {
723-
rpc->pos = 0;
724-
return CURLIOE_OK;
720+
if (rpc->initial_buffer) {
721+
if (offset < 0 || offset > rpc->len) {
722+
error("curl seek would be outside of rpc buffer");
723+
return CURL_SEEKFUNC_FAIL;
725724
}
726-
error(_("unable to rewind rpc post data - try increasing http.postBuffer"));
727-
return CURLIOE_FAILRESTART;
728-
729-
default:
730-
return CURLIOE_UNKNOWNCMD;
725+
rpc->pos = offset;
726+
return CURL_SEEKFUNC_OK;
731727
}
728+
error(_("unable to rewind rpc post data - try increasing http.postBuffer"));
729+
return CURL_SEEKFUNC_FAIL;
732730
}
733731

734732
struct check_pktline_state {
@@ -948,8 +946,8 @@ static int post_rpc(struct rpc_state *rpc, int stateless_connect, int flush_rece
948946
rpc->initial_buffer = 1;
949947
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, rpc_out);
950948
curl_easy_setopt(slot->curl, CURLOPT_INFILE, rpc);
951-
curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, rpc_ioctl);
952-
curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, rpc);
949+
curl_easy_setopt(slot->curl, CURLOPT_SEEKFUNCTION, rpc_seek);
950+
curl_easy_setopt(slot->curl, CURLOPT_SEEKDATA, rpc);
953951
if (options.verbosity > 1) {
954952
fprintf(stderr, "POST %s (chunked)\n", rpc->service_name);
955953
fflush(stderr);

0 commit comments

Comments
 (0)