From 2298078d54ad9124a2eee9c01f62a43b8a633866 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Nov 14 2019 12:57:39 +0000 Subject: Resolves: #1771025 - fix infinite loop on upload using a glob --- diff --git a/0001-curl-7.67.0-upload-glob.patch b/0001-curl-7.67.0-upload-glob.patch new file mode 100644 index 0000000..257eb22 --- /dev/null +++ b/0001-curl-7.67.0-upload-glob.patch @@ -0,0 +1,316 @@ +From 37a36231c5e34ae31b1968481fad2e8d76613fbd Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg +Date: Wed, 13 Nov 2019 11:33:29 +0100 +Subject: [PATCH] curl: fix -T globbing + +Regression from e59371a4936f8 (7.67.0) + +Added test 490, 491 and 492 to verify the functionality. + +Reported-by: Kamil Dudka +Reported-by: Anderson Sasaki + +Fixes #4588 +Closes #4591 + +Upstream-commit: 7a46aeb0be3fa00826b0c47a8bc06eddff448659 +Signed-off-by: Kamil Dudka +--- + src/tool_operate.c | 15 ++++--- + tests/data/Makefile.inc | 2 + + tests/data/test490 | 68 +++++++++++++++++++++++++++++++ + tests/data/test491 | 64 +++++++++++++++++++++++++++++ + tests/data/test492 | 89 +++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 232 insertions(+), 6 deletions(-) + create mode 100644 tests/data/test490 + create mode 100644 tests/data/test491 + create mode 100644 tests/data/test492 + +diff --git a/src/tool_operate.c b/src/tool_operate.c +index 3087d2d..4ecb1ed 100644 +--- a/src/tool_operate.c ++++ b/src/tool_operate.c +@@ -829,12 +829,6 @@ static CURLcode single_transfer(struct GlobalConfig *global, + separator = ((!state->outfiles || + !strcmp(state->outfiles, "-")) && urlnum > 1); + +- /* Here's looping around each globbed URL */ +- +- if(state->li >= urlnum) { +- state->li = 0; +- state->up++; +- } + if(state->up < state->infilenum) { + struct per_transfer *per; + struct OutStruct *outs; +@@ -1908,6 +1902,15 @@ static CURLcode single_transfer(struct GlobalConfig *global, + per->retrystart = tvnow(); + + state->li++; ++ /* Here's looping around each globbed URL */ ++ if(state->li >= urlnum) { ++ state->li = 0; ++ state->urlnum = 0; /* forced reglob of URLs */ ++ glob_cleanup(state->urls); ++ state->urls = NULL; ++ state->up++; ++ Curl_safefree(state->uploadfile); /* clear it to get the next */ ++ } + } + else { + /* Free this URL node data without destroying the +diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc +index 557f928..212900e 100644 +--- a/tests/data/Makefile.inc ++++ b/tests/data/Makefile.inc +@@ -66,6 +66,8 @@ test393 test394 test395 \ + test400 test401 test402 test403 test404 test405 test406 test407 test408 \ + test409 \ + \ ++test490 test491 test492 \ ++\ + test500 test501 test502 test503 test504 test505 test506 test507 test508 \ + test509 test510 test511 test512 test513 test514 test515 test516 test517 \ + test518 test519 test520 test521 test522 test523 test524 test525 test526 \ +diff --git a/tests/data/test490 b/tests/data/test490 +new file mode 100644 +index 0000000..a3383a9 +--- /dev/null ++++ b/tests/data/test490 +@@ -0,0 +1,68 @@ ++ ++ ++ ++HTTP ++HTTP PUT ++ ++ ++ ++# ++# Server-side ++ ++ ++HTTP/1.1 200 OK ++Date: Thu, 09 Nov 2010 14:49:00 GMT ++Server: test-server/fake ++Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT ++ETag: "21025-dc7-39462498" ++Accept-Ranges: bytes ++Content-Length: 6 ++Connection: close ++Content-Type: text/html ++Funny-head: yesyes ++ ++-foo- ++ ++ ++ ++# ++# Client-side ++ ++ ++http ++ ++ ++Two globbed HTTP PUTs ++ ++ ++http://%HOSTIP:%HTTPPORT/490 -T '{log/in490,log/in490}' ++ ++ ++surprise! ++ ++ ++ ++# ++# Verify data after the test has been "shot" ++ ++ ++^User-Agent:.* ++ ++ ++PUT /490 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Content-Length: 10 ++Expect: 100-continue ++ ++surprise! ++PUT /490 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Content-Length: 10 ++Expect: 100-continue ++ ++surprise! ++ ++ ++ +diff --git a/tests/data/test491 b/tests/data/test491 +new file mode 100644 +index 0000000..b49c06c +--- /dev/null ++++ b/tests/data/test491 +@@ -0,0 +1,64 @@ ++ ++ ++ ++HTTP ++HTTP PUT ++ ++ ++ ++# ++# Server-side ++ ++ ++HTTP/1.1 200 OK ++Date: Thu, 09 Nov 2010 14:49:00 GMT ++Server: test-server/fake ++Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT ++ETag: "21025-dc7-39462498" ++Accept-Ranges: bytes ++Content-Length: 6 ++Connection: close ++Content-Type: text/html ++Funny-head: yesyes ++ ++-foo- ++ ++ ++ ++# ++# Client-side ++ ++ ++http ++ ++ ++Two globbed HTTP PUTs, the second upload file is missing ++ ++ ++http://%HOSTIP:%HTTPPORT/491 -T '{log/in491,log/bad491}' ++ ++ ++surprise! ++ ++ ++ ++# ++# Verify data after the test has been "shot" ++ ++ ++^User-Agent:.* ++ ++ ++PUT /491 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Content-Length: 10 ++Expect: 100-continue ++ ++surprise! ++ ++ ++26 ++ ++ ++ +diff --git a/tests/data/test492 b/tests/data/test492 +new file mode 100644 +index 0000000..12edd8b +--- /dev/null ++++ b/tests/data/test492 +@@ -0,0 +1,89 @@ ++ ++ ++ ++HTTP ++HTTP PUT ++ ++ ++ ++# ++# Server-side ++ ++ ++HTTP/1.1 200 OK ++Date: Thu, 09 Nov 2010 14:49:00 GMT ++Server: test-server/fake ++Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT ++ETag: "21025-dc7-39462498" ++Accept-Ranges: bytes ++Content-Length: 6 ++Connection: close ++Content-Type: text/html ++Funny-head: yesyes ++ ++-foo- ++ ++ ++ ++# ++# Client-side ++ ++ ++http ++ ++ ++Two globbed HTTP PUTs to two globbed URLs ++ ++ ++'http://%HOSTIP:%HTTPPORT/{one,two}/' -T '{log/first492,log/second492}' -H "Testno: 492" ++ ++ ++first 492 contents ++ ++ ++second 492 contents ++ ++ ++ ++# ++# Verify data after the test has been "shot" ++ ++ ++^User-Agent:.* ++ ++ ++PUT /one/first492 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Testno: 492 ++Content-Length: 19 ++Expect: 100-continue ++ ++first 492 contents ++PUT /two/first492 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Testno: 492 ++Content-Length: 19 ++Expect: 100-continue ++ ++first 492 contents ++PUT /one/second492 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Testno: 492 ++Content-Length: 20 ++Expect: 100-continue ++ ++second 492 contents ++PUT /two/second492 HTTP/1.1 ++Host: 127.0.0.1:8990 ++Accept: */* ++Testno: 492 ++Content-Length: 20 ++Expect: 100-continue ++ ++second 492 contents ++ ++ ++ +-- +2.20.1 + diff --git a/curl.spec b/curl.spec index 9d85067..9266e40 100644 --- a/curl.spec +++ b/curl.spec @@ -1,10 +1,13 @@ Summary: A utility for getting files from remote servers (FTP, HTTP, and others) Name: curl Version: 7.67.0 -Release: 1%{?dist} +Release: 2%{?dist} License: MIT Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz +# fix infinite loop on upload using a glob (#1771025) +Patch1: 0001-curl-7.67.0-upload-glob.patch + # patch making libcurl multilib ready Patch101: 0101-curl-7.32.0-multilib.patch @@ -171,6 +174,7 @@ be installed. %setup -q # upstream patches +%patch1 -p1 # Fedora patches %patch101 -p1 @@ -346,6 +350,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la %{_libdir}/libcurl.so.4.[0-9].[0-9].minimal %changelog +* Thu Nov 28 2019 Kamil Dudka - 7.67.1-2 +- fix infinite loop on upload using a glob (#1771025) + * Wed Nov 06 2019 Kamil Dudka - 7.67.1-1 - new upstream release