From 5dee6fb8b33f1ef9ea84f54394da4aaee390ed25 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Fri, 18 May 2018 16:17:51 +0200
Subject: [PATCH 01/14] Resolves: CVE-2018-1000301 - http: restore buffer ptr
when bad response-line is parsed
---
0002-curl-7.59.0-CVE-2018-1000301.patch | 48 +++++++++++++++++++++++++
curl.spec | 9 ++++-
2 files changed, 56 insertions(+), 1 deletion(-)
create mode 100644 0002-curl-7.59.0-CVE-2018-1000301.patch
diff --git a/0002-curl-7.59.0-CVE-2018-1000301.patch b/0002-curl-7.59.0-CVE-2018-1000301.patch
new file mode 100644
index 0000000..b733979
--- /dev/null
+++ b/0002-curl-7.59.0-CVE-2018-1000301.patch
@@ -0,0 +1,48 @@
+From 5815730864a2010872840bae24797983e892eb90 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Sat, 24 Mar 2018 23:47:41 +0100
+Subject: [PATCH 1/2] http: restore buffer pointer when bad response-line is
+ parsed
+
+... leaving the k->str could lead to buffer over-reads later on.
+
+CVE: CVE-2018-1000301
+Assisted-by: Max Dymond
+
+Detected by OSS-Fuzz.
+Bug: https://curl.haxx.se/docs/adv_2018-b138.html
+Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7105
+
+Upstream-commit: 8c7b3737d29ed5c0575bf592063de8a51450812d
+Signed-off-by: Kamil Dudka
+---
+ lib/http.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/lib/http.c b/lib/http.c
+index 841f6cc..dc10f5f 100644
+--- a/lib/http.c
++++ b/lib/http.c
+@@ -2966,6 +2966,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
+ {
+ CURLcode result;
+ struct SingleRequest *k = &data->req;
++ ssize_t onread = *nread;
++ char *ostr = k->str;
+
+ /* header line within buffer loop */
+ do {
+@@ -3030,7 +3032,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
+ else {
+ /* this was all we read so it's all a bad header */
+ k->badheader = HEADER_ALLBAD;
+- *nread = (ssize_t)rest_length;
++ *nread = onread;
++ k->str = ostr;
++ return CURLE_OK;
+ }
+ break;
+ }
+--
+2.14.3
+
diff --git a/curl.spec b/curl.spec
index d722f07..4bdc523 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,13 +1,16 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 2%{?dist}
+Release: 3%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
# ftp: fix typo in recursive callback detection for seeking
Patch1: 0001-curl-7.58.0-ftp-typo-in-recursive-callback-detection.patch
+# fix RTSP bad headers buffer over-read (CVE-2018-1000301)
+Patch2: 0002-curl-7.59.0-CVE-2018-1000301.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -155,6 +158,7 @@ be installed.
# upstream patches
%patch1 -p1
+%patch2 -p1
# Fedora patches
%patch101 -p1
@@ -300,6 +304,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Fri May 18 2018 Kamil Dudka - 7.59.0-3
+- fix RTSP bad headers buffer over-read (CVE-2018-1000301)
+
* Wed Mar 14 2018 Kamil Dudka - 7.59.0-2
- ftp: fix typo in recursive callback detection for seeking
From 73d6b73380f22edd6565e870ac6aa169c74b6e3f Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Fri, 18 May 2018 16:20:36 +0200
Subject: [PATCH 02/14] Resolves: CVE-2018-1000300 - fix FTP shutdown response
buffer overflow
---
0003-curl-7.59.0-CVE-2018-1000300.patch | 39 +++++++++++++++++++++++++
curl.spec | 5 ++++
2 files changed, 44 insertions(+)
create mode 100644 0003-curl-7.59.0-CVE-2018-1000300.patch
diff --git a/0003-curl-7.59.0-CVE-2018-1000300.patch b/0003-curl-7.59.0-CVE-2018-1000300.patch
new file mode 100644
index 0000000..fb4d15b
--- /dev/null
+++ b/0003-curl-7.59.0-CVE-2018-1000300.patch
@@ -0,0 +1,39 @@
+From 9b757a9a431f6859807d9f6e697cc2d2a120098d Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Fri, 23 Mar 2018 23:30:04 +0100
+Subject: [PATCH 2/2] pingpong: fix response cache memcpy overflow
+
+Response data for a handle with a large buffer might be cached and then
+used with the "closure" handle when it has a smaller buffer and then the
+larger cache will be copied and overflow the new smaller heap based
+buffer.
+
+Reported-by: Dario Weisser
+CVE: CVE-2018-1000300
+Bug: https://curl.haxx.se/docs/adv_2018-82c2.html
+
+Upstream-commit: 583b42cb3b809b1bf597af160468ccba728c2248
+Signed-off-by: Kamil Dudka
+---
+ lib/pingpong.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/lib/pingpong.c b/lib/pingpong.c
+index 438856a..ad370ee 100644
+--- a/lib/pingpong.c
++++ b/lib/pingpong.c
+@@ -304,7 +304,10 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
+ * it would have been populated with something of size int to begin
+ * with, even though its datatype may be larger than an int.
+ */
+- DEBUGASSERT((ptr + pp->cache_size) <= (buf + data->set.buffer_size + 1));
++ if((ptr + pp->cache_size) > (buf + data->set.buffer_size + 1)) {
++ failf(data, "cached response data too big to handle");
++ return CURLE_RECV_ERROR;
++ }
+ memcpy(ptr, pp->cache, pp->cache_size);
+ gotbytes = (ssize_t)pp->cache_size;
+ free(pp->cache); /* free the cache */
+--
+2.14.3
+
diff --git a/curl.spec b/curl.spec
index 4bdc523..904ba10 100644
--- a/curl.spec
+++ b/curl.spec
@@ -11,6 +11,9 @@ Patch1: 0001-curl-7.58.0-ftp-typo-in-recursive-callback-detection.patch
# fix RTSP bad headers buffer over-read (CVE-2018-1000301)
Patch2: 0002-curl-7.59.0-CVE-2018-1000301.patch
+# fix FTP shutdown response buffer overflow (CVE-2018-1000300)
+Patch3: 0003-curl-7.59.0-CVE-2018-1000300.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -159,6 +162,7 @@ be installed.
# upstream patches
%patch1 -p1
%patch2 -p1
+%patch3 -p1
# Fedora patches
%patch101 -p1
@@ -305,6 +309,7 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%changelog
* Fri May 18 2018 Kamil Dudka - 7.59.0-3
+- fix FTP shutdown response buffer overflow (CVE-2018-1000300)
- fix RTSP bad headers buffer over-read (CVE-2018-1000301)
* Wed Mar 14 2018 Kamil Dudka - 7.59.0-2
From 67e93f67b8904524e2013cef126d5f6d7e5b18e4 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Tue, 5 Jun 2018 15:10:20 +0200
Subject: [PATCH 03/14] Resolves: #1585797 - http2: handle GOAWAY properly
---
0004-curl-7.59.0-http2-GOAWAY.patch | 137 ++++++++++++++++++++++++++++
curl.spec | 9 +-
2 files changed, 145 insertions(+), 1 deletion(-)
create mode 100644 0004-curl-7.59.0-http2-GOAWAY.patch
diff --git a/0004-curl-7.59.0-http2-GOAWAY.patch b/0004-curl-7.59.0-http2-GOAWAY.patch
new file mode 100644
index 0000000..0e76a6e
--- /dev/null
+++ b/0004-curl-7.59.0-http2-GOAWAY.patch
@@ -0,0 +1,137 @@
+From 84ddda3994c1f12d79946780dee9111b3cf1c308 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Thu, 19 Apr 2018 20:03:30 +0200
+Subject: [PATCH] http2: handle GOAWAY properly
+
+When receiving REFUSED_STREAM, mark the connection for close and retry
+streams accordingly on another/fresh connection.
+
+Reported-by: Terry Wu
+Fixes #2416
+Fixes #1618
+Closes #2510
+
+Upstream-commit: d122df5972fc01e39ae28e6bca705237d7e3318a
+Signed-off-by: Kamil Dudka
+---
+ lib/http2.c | 17 ++++++++++++-----
+ lib/multi.c | 4 +++-
+ lib/transfer.c | 17 +++++++++++++++--
+ lib/urldata.h | 2 +-
+ 4 files changed, 31 insertions(+), 9 deletions(-)
+
+diff --git a/lib/http2.c b/lib/http2.c
+index b2c34e9..fba4d70 100644
+--- a/lib/http2.c
++++ b/lib/http2.c
+@@ -1078,7 +1078,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
+ struct http_conn *httpc = &conn->proto.httpc;
+
+ if(http->header_recvbuf) {
+- H2BUGF(infof(data, "free header_recvbuf!!\n"));
+ Curl_add_buffer_free(http->header_recvbuf);
+ http->header_recvbuf = NULL; /* clear the pointer */
+ Curl_add_buffer_free(http->trailer_recvbuf);
+@@ -1351,7 +1350,15 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
+
+ /* Reset to FALSE to prevent infinite loop in readwrite_data function. */
+ stream->closed = FALSE;
+- if(httpc->error_code != NGHTTP2_NO_ERROR) {
++ if(httpc->error_code == NGHTTP2_REFUSED_STREAM) {
++ H2BUGF(infof(data, "REFUSED_STREAM (%d), try again on a new connection!\n",
++ stream->stream_id));
++ connclose(conn, "REFUSED_STREAM"); /* don't use this anymore */
++ data->state.refused_stream = TRUE;
++ *err = CURLE_RECV_ERROR; /* trigger Curl_retry_request() later */
++ return -1;
++ }
++ else if(httpc->error_code != NGHTTP2_NO_ERROR) {
+ failf(data, "HTTP/2 stream %u was not closed cleanly: %s (err %d)",
+ stream->stream_id, Curl_http2_strerror(httpc->error_code),
+ httpc->error_code);
+@@ -1579,9 +1586,9 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
+ }
+
+ if(nread == 0) {
+- failf(data, "Unexpected EOF");
+- *err = CURLE_RECV_ERROR;
+- return -1;
++ H2BUGF(infof(data, "end of stream\n"));
++ *err = CURLE_OK;
++ return 0;
+ }
+
+ H2BUGF(infof(data, "nread=%zd\n", nread));
+diff --git a/lib/multi.c b/lib/multi.c
+index 98e5fca..d69e5f9 100644
+--- a/lib/multi.c
++++ b/lib/multi.c
+@@ -541,7 +541,9 @@ static CURLcode multi_done(struct connectdata **connp,
+ if(conn->send_pipe.size || conn->recv_pipe.size) {
+ /* Stop if pipeline is not empty . */
+ data->easy_conn = NULL;
+- DEBUGF(infof(data, "Connection still in use, no more multi_done now!\n"));
++ DEBUGF(infof(data, "Connection still in use %d/%d, "
++ "no more multi_done now!\n",
++ conn->send_pipe.size, conn->recv_pipe.size));
+ return CURLE_OK;
+ }
+
+diff --git a/lib/transfer.c b/lib/transfer.c
+index fd9af31..5c29cc9 100644
+--- a/lib/transfer.c
++++ b/lib/transfer.c
+@@ -1926,7 +1926,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
+ char **url)
+ {
+ struct Curl_easy *data = conn->data;
+-
++ bool retry = FALSE;
+ *url = NULL;
+
+ /* if we're talking upload, we can't do the checks below, unless the protocol
+@@ -1939,7 +1939,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
+ conn->bits.reuse &&
+ (!data->set.opt_no_body
+ || (conn->handler->protocol & PROTO_FAMILY_HTTP)) &&
+- (data->set.rtspreq != RTSPREQ_RECEIVE)) {
++ (data->set.rtspreq != RTSPREQ_RECEIVE))
+ /* We got no data, we attempted to re-use a connection. For HTTP this
+ can be a retry so we try again regardless if we expected a body.
+ For other protocols we only try again only if we expected a body.
+@@ -1947,6 +1947,19 @@ CURLcode Curl_retry_request(struct connectdata *conn,
+ This might happen if the connection was left alive when we were
+ done using it before, but that was closed when we wanted to read from
+ it again. Bad luck. Retry the same request on a fresh connect! */
++ retry = TRUE;
++ else if(data->state.refused_stream &&
++ (data->req.bytecount + data->req.headerbytecount == 0) ) {
++ /* This was sent on a refused stream, safe to rerun. A refused stream
++ error can typically only happen on HTTP/2 level if the stream is safe
++ to issue again, but the nghttp2 API can deliver the message to other
++ streams as well, which is why this adds the check the data counters
++ too. */
++ infof(conn->data, "REFUSED_STREAM, retrying a fresh connect\n");
++ data->state.refused_stream = FALSE; /* clear again */
++ retry = TRUE;
++ }
++ if(retry) {
+ infof(conn->data, "Connection died, retrying a fresh connect\n");
+ *url = strdup(conn->data->change.url);
+ if(!*url)
+diff --git a/lib/urldata.h b/lib/urldata.h
+index 3d7b9e5..6a36ee9 100644
+--- a/lib/urldata.h
++++ b/lib/urldata.h
+@@ -1225,7 +1225,7 @@ struct UrlState {
+ curl_off_t current_speed; /* the ProgressShow() function sets this,
+ bytes / second */
+ bool this_is_a_follow; /* this is a followed Location: request */
+-
++ bool refused_stream; /* this was refused, try again */
+ char *first_host; /* host name of the first (not followed) request.
+ if set, this should be the host name that we will
+ sent authorization to, no else. Used to make Location:
+--
+2.14.4
+
diff --git a/curl.spec b/curl.spec
index 904ba10..abf84a4 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -14,6 +14,9 @@ Patch2: 0002-curl-7.59.0-CVE-2018-1000301.patch
# fix FTP shutdown response buffer overflow (CVE-2018-1000300)
Patch3: 0003-curl-7.59.0-CVE-2018-1000300.patch
+# http2: handle GOAWAY properly (#1585797)
+Patch4: 0004-curl-7.59.0-http2-GOAWAY.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -163,6 +166,7 @@ be installed.
%patch1 -p1
%patch2 -p1
%patch3 -p1
+%patch4 -p1
# Fedora patches
%patch101 -p1
@@ -308,6 +312,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Tue Jun 05 2018 Kamil Dudka - 7.59.0-4
+- http2: handle GOAWAY properly (#1585797)
+
* Fri May 18 2018 Kamil Dudka - 7.59.0-3
- fix FTP shutdown response buffer overflow (CVE-2018-1000300)
- fix RTSP bad headers buffer over-read (CVE-2018-1000301)
From c79dff9b8baa2cb7ca51060f7303d91092fb7d0a Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Wed, 11 Jul 2018 17:51:58 +0200
Subject: [PATCH 04/14] Resolves: CVE-2018-0500 - fix heap buffer overflow in
SMTP send
---
0005-curl-7.59.0-CVE-2018-0500.patch | 40 ++++++++++++++++++++++++++++
curl.spec | 9 ++++++-
2 files changed, 48 insertions(+), 1 deletion(-)
create mode 100644 0005-curl-7.59.0-CVE-2018-0500.patch
diff --git a/0005-curl-7.59.0-CVE-2018-0500.patch b/0005-curl-7.59.0-CVE-2018-0500.patch
new file mode 100644
index 0000000..221c05f
--- /dev/null
+++ b/0005-curl-7.59.0-CVE-2018-0500.patch
@@ -0,0 +1,40 @@
+From 7a5d2b67b8bee753735d4b03f66c4054d9b812f9 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Wed, 13 Jun 2018 12:24:40 +0200
+Subject: [PATCH] smtp: use the upload buffer size for scratch buffer malloc
+
+... not the read buffer size, as that can be set smaller and thus cause
+a buffer overflow! CVE-2018-0500
+
+Reported-by: Peter Wu
+Bug: https://curl.haxx.se/docs/adv_2018-70a2.html
+
+Upstream-commit: ba1dbd78e5f1ed67c1b8d37ac89d90e5e330b628
+Signed-off-by: Kamil Dudka
+---
+ lib/smtp.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/smtp.c b/lib/smtp.c
+index 3f3b45a..400ad54 100644
+--- a/lib/smtp.c
++++ b/lib/smtp.c
+@@ -1563,13 +1563,14 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread)
+ if(!scratch || data->set.crlf) {
+ oldscratch = scratch;
+
+- scratch = newscratch = malloc(2 * data->set.buffer_size);
++ scratch = newscratch = malloc(2 * UPLOAD_BUFSIZE);
+ if(!newscratch) {
+ failf(data, "Failed to alloc scratch buffer!");
+
+ return CURLE_OUT_OF_MEMORY;
+ }
+ }
++ DEBUGASSERT(UPLOAD_BUFSIZE >= nread);
+
+ /* Have we already sent part of the EOB? */
+ eob_sent = smtp->eob;
+--
+2.14.4
+
diff --git a/curl.spec b/curl.spec
index abf84a4..008dd3f 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -17,6 +17,9 @@ Patch3: 0003-curl-7.59.0-CVE-2018-1000300.patch
# http2: handle GOAWAY properly (#1585797)
Patch4: 0004-curl-7.59.0-http2-GOAWAY.patch
+# fix heap buffer overflow in SMTP send (CVE-2018-0500)
+Patch5: 0005-curl-7.59.0-CVE-2018-0500.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -167,6 +170,7 @@ be installed.
%patch2 -p1
%patch3 -p1
%patch4 -p1
+%patch5 -p1
# Fedora patches
%patch101 -p1
@@ -312,6 +316,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Wed Jul 11 2018 Kamil Dudka - 7.59.0-5
+- fix heap buffer overflow in SMTP send (CVE-2018-0500)
+
* Tue Jun 05 2018 Kamil Dudka - 7.59.0-4
- http2: handle GOAWAY properly (#1585797)
From ab86f69980d8f5936b4fcfa98669c1bb8bfc1265 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 9 Aug 2018 13:37:25 +0200
Subject: [PATCH 05/14] Resolves: #1219544 - ssl: set engine implicitly when a
PKCS#11 URI is provided
---
0006-curl-7.59.0-pkcs11.patch | 225 ++++++++++++++++++++++++++++++++++
curl.spec | 9 +-
2 files changed, 233 insertions(+), 1 deletion(-)
create mode 100644 0006-curl-7.59.0-pkcs11.patch
diff --git a/0006-curl-7.59.0-pkcs11.patch b/0006-curl-7.59.0-pkcs11.patch
new file mode 100644
index 0000000..d0f8ff1
--- /dev/null
+++ b/0006-curl-7.59.0-pkcs11.patch
@@ -0,0 +1,225 @@
+From cf48e08b1a7c480e43d6e66154e94c5029c0d335 Mon Sep 17 00:00:00 2001
+From: Anderson Toshiyuki Sasaki
+Date: Mon, 19 Feb 2018 14:31:06 +0100
+Subject: [PATCH] ssl: set engine implicitly when a PKCS#11 URI is provided
+
+This allows the use of PKCS#11 URI for certificates and keys without
+setting the corresponding type as "ENG" and the engine as "pkcs11"
+explicitly. If a PKCS#11 URI is provided for certificate, key,
+proxy_certificate or proxy_key, the corresponding type is set as "ENG"
+if not provided and the engine is set to "pkcs11" if not provided.
+
+Acked-by: Nikos Mavrogiannopoulos
+Closes #2333
+
+Upstream-commit: 298d2565e2a2f06a859b7f5a1cc24ba7c87a8ce2
+Signed-off-by: Kamil Dudka
+---
+ docs/cmdline-opts/cert.d | 7 ++++++
+ docs/cmdline-opts/key.d | 7 ++++++
+ lib/vtls/openssl.c | 38 ++++++++++++++++++++++++++++
+ src/tool_getparam.c | 2 +-
+ src/tool_operate.c | 53 ++++++++++++++++++++++++++++++++++++++++
+ tests/unit/unit1394.c | 3 +++
+ 6 files changed, 109 insertions(+), 1 deletion(-)
+
+diff --git a/docs/cmdline-opts/cert.d b/docs/cmdline-opts/cert.d
+index 0cd5d53..ae6fe2f 100644
+--- a/docs/cmdline-opts/cert.d
++++ b/docs/cmdline-opts/cert.d
+@@ -23,6 +23,13 @@ nickname contains ":", it needs to be preceded by "\\" so that it is not
+ recognized as password delimiter. If the nickname contains "\\", it needs to
+ be escaped as "\\\\" so that it is not recognized as an escape character.
+
++If curl is built against OpenSSL library, and the engine pkcs11 is available,
++then a PKCS#11 URI (RFC 7512) can be used to specify a certificate located in
++a PKCS#11 device. A string beginning with "pkcs11:" will be interpreted as a
++PKCS#11 URI. If a PKCS#11 URI is provided, then the --engine option will be set
++as "pkcs11" if none was provided and the --cert-type option will be set as
++"ENG" if none was provided.
++
+ (iOS and macOS only) If curl is built against Secure Transport, then the
+ certificate string can either be the name of a certificate/private key in the
+ system or user keychain, or the path to a PKCS#12-encoded certificate and
+diff --git a/docs/cmdline-opts/key.d b/docs/cmdline-opts/key.d
+index fbf583a..4877b42 100644
+--- a/docs/cmdline-opts/key.d
++++ b/docs/cmdline-opts/key.d
+@@ -7,4 +7,11 @@ Private key file name. Allows you to provide your private key in this separate
+ file. For SSH, if not specified, curl tries the following candidates in order:
+ '~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
+
++If curl is built against OpenSSL library, and the engine pkcs11 is available,
++then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a
++PKCS#11 device. A string beginning with "pkcs11:" will be interpreted as a
++PKCS#11 URI. If a PKCS#11 URI is provided, then the --engine option will be set
++as "pkcs11" if none was provided and the --key-type option will be set as
++"ENG" if none was provided.
++
+ If this option is used several times, the last one will be used.
+diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
+index 2a6b3cf..5f16dbd 100644
+--- a/lib/vtls/openssl.c
++++ b/lib/vtls/openssl.c
+@@ -532,8 +532,25 @@ static int ssl_ui_writer(UI *ui, UI_STRING *uis)
+ }
+ return (UI_method_get_writer(UI_OpenSSL()))(ui, uis);
+ }
++
++/*
++ * Check if a given string is a PKCS#11 URI
++ */
++static bool is_pkcs11_uri(const char *string)
++{
++ if(strncasecompare(string, "pkcs11:", 7)) {
++ return TRUE;
++ }
++ else {
++ return FALSE;
++ }
++}
++
+ #endif
+
++static CURLcode Curl_ossl_set_engine(struct Curl_easy *data,
++ const char *engine);
++
+ static
+ int cert_stuff(struct connectdata *conn,
+ SSL_CTX* ctx,
+@@ -596,6 +613,16 @@ int cert_stuff(struct connectdata *conn,
+ case SSL_FILETYPE_ENGINE:
+ #if defined(HAVE_OPENSSL_ENGINE_H) && defined(ENGINE_CTRL_GET_CMD_FROM_NAME)
+ {
++ /* Implicitly use pkcs11 engine if none was provided and the
++ * cert_file is a PKCS#11 URI */
++ if(!data->state.engine) {
++ if(is_pkcs11_uri(cert_file)) {
++ if(Curl_ossl_set_engine(data, "pkcs11") != CURLE_OK) {
++ return 0;
++ }
++ }
++ }
++
+ if(data->state.engine) {
+ const char *cmd_name = "LOAD_CERT_CTRL";
+ struct {
+@@ -762,6 +789,17 @@ int cert_stuff(struct connectdata *conn,
+ #ifdef HAVE_OPENSSL_ENGINE_H
+ { /* XXXX still needs some work */
+ EVP_PKEY *priv_key = NULL;
++
++ /* Implicitly use pkcs11 engine if none was provided and the
++ * key_file is a PKCS#11 URI */
++ if(!data->state.engine) {
++ if(is_pkcs11_uri(key_file)) {
++ if(Curl_ossl_set_engine(data, "pkcs11") != CURLE_OK) {
++ return 0;
++ }
++ }
++ }
++
+ if(data->state.engine) {
+ UI_METHOD *ui_method =
+ UI_create_method((char *)"curl user interface");
+diff --git a/src/tool_getparam.c b/src/tool_getparam.c
+index 7ce9c28..6628247 100644
+--- a/src/tool_getparam.c
++++ b/src/tool_getparam.c
+@@ -337,7 +337,7 @@ void parse_cert_parameter(const char *cert_parameter,
+ * looks like a RFC7512 PKCS#11 URI which can be used as-is.
+ * Also if cert_parameter contains no colon nor backslash, this
+ * means no passphrase was given and no characters escaped */
+- if(!strncmp(cert_parameter, "pkcs11:", 7) ||
++ if(curl_strnequal(cert_parameter, "pkcs11:", 7) ||
+ !strpbrk(cert_parameter, ":\\")) {
+ *certname = strdup(cert_parameter);
+ return;
+diff --git a/src/tool_operate.c b/src/tool_operate.c
+index e8b434a..fa44c70 100644
+--- a/src/tool_operate.c
++++ b/src/tool_operate.c
+@@ -113,6 +113,19 @@ static bool is_fatal_error(CURLcode code)
+ return FALSE;
+ }
+
++/*
++ * Check if a given string is a PKCS#11 URI
++ */
++static bool is_pkcs11_uri(const char *string)
++{
++ if(curl_strnequal(string, "pkcs11:", 7)) {
++ return TRUE;
++ }
++ else {
++ return FALSE;
++ }
++}
++
+ #ifdef __VMS
+ /*
+ * get_vms_file_size does what it takes to get the real size of the file
+@@ -1057,6 +1070,46 @@ static CURLcode operate_do(struct GlobalConfig *global,
+ my_setopt_str(curl, CURLOPT_PINNEDPUBLICKEY, config->pinnedpubkey);
+
+ if(curlinfo->features & CURL_VERSION_SSL) {
++ /* Check if config->cert is a PKCS#11 URI and set the
++ * config->cert_type if necessary */
++ if(config->cert) {
++ if(!config->cert_type) {
++ if(is_pkcs11_uri(config->cert)) {
++ config->cert_type = strdup("ENG");
++ }
++ }
++ }
++
++ /* Check if config->key is a PKCS#11 URI and set the
++ * config->key_type if necessary */
++ if(config->key) {
++ if(!config->key_type) {
++ if(is_pkcs11_uri(config->key)) {
++ config->key_type = strdup("ENG");
++ }
++ }
++ }
++
++ /* Check if config->proxy_cert is a PKCS#11 URI and set the
++ * config->proxy_type if necessary */
++ if(config->proxy_cert) {
++ if(!config->proxy_cert_type) {
++ if(is_pkcs11_uri(config->proxy_cert)) {
++ config->proxy_cert_type = strdup("ENG");
++ }
++ }
++ }
++
++ /* Check if config->proxy_key is a PKCS#11 URI and set the
++ * config->proxy_key_type if necessary */
++ if(config->proxy_key) {
++ if(!config->proxy_key_type) {
++ if(is_pkcs11_uri(config->proxy_key)) {
++ config->proxy_key_type = strdup("ENG");
++ }
++ }
++ }
++
+ my_setopt_str(curl, CURLOPT_SSLCERT, config->cert);
+ my_setopt_str(curl, CURLOPT_PROXY_SSLCERT, config->proxy_cert);
+ my_setopt_str(curl, CURLOPT_SSLCERTTYPE, config->cert_type);
+diff --git a/tests/unit/unit1394.c b/tests/unit/unit1394.c
+index 667991d..010f052 100644
+--- a/tests/unit/unit1394.c
++++ b/tests/unit/unit1394.c
+@@ -56,6 +56,9 @@ UNITTEST_START
+ "foo:bar\\\\", "foo", "bar\\\\",
+ "foo:bar:", "foo", "bar:",
+ "foo\\::bar\\:", "foo:", "bar\\:",
++ "pkcs11:foobar", "pkcs11:foobar", NULL,
++ "PKCS11:foobar", "PKCS11:foobar", NULL,
++ "PkCs11:foobar", "PkCs11:foobar", NULL,
+ #ifdef WIN32
+ "c:\\foo:bar:baz", "c:\\foo", "bar:baz",
+ "c:\\foo\\:bar:baz", "c:\\foo:bar", "baz",
+--
+2.17.1
+
diff --git a/curl.spec b/curl.spec
index 008dd3f..a49e005 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 5%{?dist}
+Release: 6%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -20,6 +20,9 @@ Patch4: 0004-curl-7.59.0-http2-GOAWAY.patch
# fix heap buffer overflow in SMTP send (CVE-2018-0500)
Patch5: 0005-curl-7.59.0-CVE-2018-0500.patch
+# ssl: set engine implicitly when a PKCS#11 URI is provided (#1219544)
+Patch6: 0006-curl-7.59.0-pkcs11.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -171,6 +174,7 @@ be installed.
%patch3 -p1
%patch4 -p1
%patch5 -p1
+%patch6 -p1
# Fedora patches
%patch101 -p1
@@ -316,6 +320,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Thu Aug 09 2018 Kamil Dudka - 7.59.0-6
+- ssl: set engine implicitly when a PKCS#11 URI is provided (#1219544)
+
* Wed Jul 11 2018 Kamil Dudka - 7.59.0-5
- fix heap buffer overflow in SMTP send (CVE-2018-0500)
From 964e6fe0a35b78324a7c2b9618192029dabf2726 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Wed, 15 Aug 2018 13:56:12 +0200
Subject: [PATCH 06/14] Resolves: #1595135 - scp/sftp: fix infinite connect
loop on invalid private key
---
0007-curl-7.61.0-libssh.patch | 133 ++++++++++++++++++++++++++++++++++
curl.spec | 16 +++-
2 files changed, 145 insertions(+), 4 deletions(-)
create mode 100644 0007-curl-7.61.0-libssh.patch
diff --git a/0007-curl-7.61.0-libssh.patch b/0007-curl-7.61.0-libssh.patch
new file mode 100644
index 0000000..496e9b1
--- /dev/null
+++ b/0007-curl-7.61.0-libssh.patch
@@ -0,0 +1,133 @@
+From 155d4ffb7d40daf2afa0102f91f810675220ab6e Mon Sep 17 00:00:00 2001
+From: Kamil Dudka
+Date: Tue, 14 Aug 2018 13:14:49 +0200
+Subject: [PATCH 1/2] ssh-libssh: reduce excessive verbose output about pubkey
+ auth
+
+The verbose message "Authentication using SSH public key file" was
+printed each time the ssh_userauth_publickey_auto() was called, which
+meant each time a packet was transferred over network because the API
+operates in non-blocking mode.
+
+This patch makes sure that the verbose message is printed just once
+(when the authentication state is entered by the SSH state machine).
+
+Upstream-commit: 1e843a31a49484aeddf8f358e71392205f5fd6b1
+Signed-off-by: Kamil Dudka
+---
+ lib/ssh-libssh.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/lib/ssh-libssh.c b/lib/ssh-libssh.c
+index cecf477ac..f40f074b9 100644
+--- a/lib/ssh-libssh.c
++++ b/lib/ssh-libssh.c
+@@ -607,6 +607,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
+ sshc->auth_methods = ssh_userauth_list(sshc->ssh_session, NULL);
+ if(sshc->auth_methods & SSH_AUTH_METHOD_PUBLICKEY) {
+ state(conn, SSH_AUTH_PKEY_INIT);
++ infof(data, "Authentication using SSH public key file\n");
+ }
+ else if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) {
+ state(conn, SSH_AUTH_GSSAPI);
+@@ -659,8 +660,6 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
+
+ }
+ else {
+- infof(data, "Authentication using SSH public key file\n");
+-
+ rc = ssh_userauth_publickey_auto(sshc->ssh_session, NULL,
+ data->set.ssl.key_passwd);
+ if(rc == SSH_AUTH_AGAIN) {
+--
+2.17.1
+
+
+From 4b445519694ab620bd6376066844a7076e8ce4ab Mon Sep 17 00:00:00 2001
+From: Kamil Dudka
+Date: Tue, 14 Aug 2018 12:47:18 +0200
+Subject: [PATCH 2/2] ssh-libssh: fix infinite connect loop on invalid private
+ key
+
+Added test 656 (based on test 604) to verify the fix.
+
+Bug: https://bugzilla.redhat.com/1595135
+
+Closes #2879
+
+Upstream-commit: a4c7911a48dadb4f68ba6b38bb1bf3f061b747f6
+Signed-off-by: Kamil Dudka
+---
+ lib/ssh-libssh.c | 1 +
+ tests/data/Makefile.inc | 2 +-
+ tests/data/test656 | 33 +++++++++++++++++++++++++++++++++
+ 3 files changed, 35 insertions(+), 1 deletion(-)
+ create mode 100644 tests/data/test656
+
+diff --git a/lib/ssh-libssh.c b/lib/ssh-libssh.c
+index f40f074b9..12d618cfe 100644
+--- a/lib/ssh-libssh.c
++++ b/lib/ssh-libssh.c
+@@ -652,6 +652,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
+ if(rc != SSH_OK) {
+ failf(data, "Could not load private key file %s",
+ data->set.str[STRING_SSH_PRIVATE_KEY]);
++ MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
+ break;
+ }
+
+diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
+index 20274b37c..518a5a543 100644
+--- a/tests/data/Makefile.inc
++++ b/tests/data/Makefile.inc
+@@ -83,7 +83,7 @@ test617 test618 test619 test620 test621 test622 test623 test624 test625 \
+ test626 test627 test628 test629 test630 test631 test632 test633 test634 \
+ test635 test636 test637 test638 test639 test640 test641 test642 \
+ test643 test644 test645 test646 test647 test648 test649 test650 test651 \
+-test652 test653 test654 test655 \
++test652 test653 test654 test655 test656 \
+ \
+ test700 test701 test702 test703 test704 test705 test706 test707 test708 \
+ test709 test710 test711 test712 test713 test714 test715 \
+diff --git a/tests/data/test656 b/tests/data/test656
+new file mode 100644
+index 000000000..4107d3d17
+--- /dev/null
++++ b/tests/data/test656
+@@ -0,0 +1,33 @@
++
++
++
++SFTP
++FAILURE
++
++
++
++#
++# Client-side
++
++
++sftp
++
++
++SFTP retrieval with nonexistent private key file
++
++
++--key DOES_NOT_EXIST --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%PWD/not-a-valid-file-moooo --insecure --connect-timeout 8
++
++
++
++#
++# Verify data after the test has been "shot"
++
++
++disable
++
++
++67
++
++
++
+--
+2.17.1
+
diff --git a/curl.spec b/curl.spec
index a49e005..1e7aff0 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 6%{?dist}
+Release: 7%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -23,6 +23,9 @@ Patch5: 0005-curl-7.59.0-CVE-2018-0500.patch
# ssl: set engine implicitly when a PKCS#11 URI is provided (#1219544)
Patch6: 0006-curl-7.59.0-pkcs11.patch
+# scp/sftp: fix infinite connect loop on invalid private key (#1595135)
+Patch7: 0007-curl-7.61.0-libssh.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -35,7 +38,8 @@ Patch104: 0104-curl-7.19.7-localhost6.patch
Provides: curl-full = %{version}-%{release}
Provides: webclient
URL: https://curl.haxx.se/
-#BuildRequires: automake
+
+BuildRequires: automake
BuildRequires: coreutils
BuildRequires: gcc
BuildRequires: groff
@@ -175,6 +179,7 @@ be installed.
%patch4 -p1
%patch5 -p1
%patch6 -p1
+%patch7 -p1
# Fedora patches
%patch101 -p1
@@ -182,8 +187,8 @@ be installed.
%patch104 -p1
# regenerate Makefile.in files
-#aclocal -I m4
-#automake
+aclocal -I m4
+automake
# disable test 1112 (#565305) and test 1801
#
@@ -320,6 +325,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Wed Sep 05 2018 Kamil Dudka - 7.59.0-7
+- scp/sftp: fix infinite connect loop on invalid private key (#1595135)
+
* Thu Aug 09 2018 Kamil Dudka - 7.59.0-6
- ssl: set engine implicitly when a PKCS#11 URI is provided (#1219544)
From 503408095bf15813c472c371f8b4c2fd23b59d60 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Mon, 27 Aug 2018 15:58:33 +0200
Subject: [PATCH 07/14] Related: #1622594 - tests: make ssh-keygen always
produce PEM format
The default format produced by openssh-7.8p1 cannot be consumed
by currently available versions of libssh and libssh2.
---
0105-curl-7.61.0-tests-ssh-keygen.patch | 33 +++++++++++++++++++++++++
curl.spec | 5 ++++
2 files changed, 38 insertions(+)
create mode 100644 0105-curl-7.61.0-tests-ssh-keygen.patch
diff --git a/0105-curl-7.61.0-tests-ssh-keygen.patch b/0105-curl-7.61.0-tests-ssh-keygen.patch
new file mode 100644
index 0000000..b8b9ffb
--- /dev/null
+++ b/0105-curl-7.61.0-tests-ssh-keygen.patch
@@ -0,0 +1,33 @@
+From daded1aff280104d16e405fcd1be1a857c74b191 Mon Sep 17 00:00:00 2001
+From: Kamil Dudka
+Date: Mon, 27 Aug 2018 15:53:35 +0200
+Subject: [PATCH] tests: make ssh-keygen always produce PEM format
+
+The default format produced by openssh-7.8p1 cannot be consumed
+by currently available versions of libssh and libssh2.
+---
+ tests/sshserver.pl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/sshserver.pl b/tests/sshserver.pl
+index 9b3d122..d477a02 100755
+--- a/tests/sshserver.pl
++++ b/tests/sshserver.pl
+@@ -372,12 +372,12 @@ if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) ||
+ # Make sure all files are gone so ssh-keygen doesn't complain
+ unlink($hstprvkeyf, $hstpubkeyf, $cliprvkeyf, $clipubkeyf);
+ logmsg 'generating host keys...' if($verbose);
+- if(system "\"$sshkeygen\" -q -t rsa -f $hstprvkeyf -C 'curl test server' -N ''") {
++ if(system "\"$sshkeygen\" -q -t rsa -f $hstprvkeyf -C 'curl test server' -N '' -m PEM") {
+ logmsg 'Could not generate host key';
+ exit 1;
+ }
+ logmsg 'generating client keys...' if($verbose);
+- if(system "\"$sshkeygen\" -q -t rsa -f $cliprvkeyf -C 'curl test client' -N ''") {
++ if(system "\"$sshkeygen\" -q -t rsa -f $cliprvkeyf -C 'curl test client' -N '' -m PEM") {
+ logmsg 'Could not generate client key';
+ exit 1;
+ }
+--
+2.17.1
+
diff --git a/curl.spec b/curl.spec
index 1e7aff0..c0d7575 100644
--- a/curl.spec
+++ b/curl.spec
@@ -35,6 +35,9 @@ Patch102: 0102-curl-7.36.0-debug.patch
# use localhost6 instead of ip6-localhost in the curl test-suite
Patch104: 0104-curl-7.19.7-localhost6.patch
+# tests: make ssh-keygen always produce PEM format (#1622594)
+Patch105: 0105-curl-7.61.0-tests-ssh-keygen.patch
+
Provides: curl-full = %{version}-%{release}
Provides: webclient
URL: https://curl.haxx.se/
@@ -185,6 +188,7 @@ be installed.
%patch101 -p1
%patch102 -p1
%patch104 -p1
+%patch105 -p1
# regenerate Makefile.in files
aclocal -I m4
@@ -326,6 +330,7 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%changelog
* Wed Sep 05 2018 Kamil Dudka - 7.59.0-7
+- tests: make ssh-keygen always produce PEM format (#1622594)
- scp/sftp: fix infinite connect loop on invalid private key (#1595135)
* Thu Aug 09 2018 Kamil Dudka - 7.59.0-6
From 5f4e92def348a7733bdce0d2aeb7d57b2a42000e Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Wed, 5 Sep 2018 13:03:52 +0200
Subject: [PATCH 08/14] Resolves: CVE-2018-14618 - fix NTLM password overflow
via integer overflow
---
0008-curl-7.59.0-CVE-2018-14618.patch | 72 +++++++++++++++++++++++++++
curl.spec | 5 ++
2 files changed, 77 insertions(+)
create mode 100644 0008-curl-7.59.0-CVE-2018-14618.patch
diff --git a/0008-curl-7.59.0-CVE-2018-14618.patch b/0008-curl-7.59.0-CVE-2018-14618.patch
new file mode 100644
index 0000000..e9ed142
--- /dev/null
+++ b/0008-curl-7.59.0-CVE-2018-14618.patch
@@ -0,0 +1,72 @@
+From 114b31ab5b7e6965b629697020a7ce4b6cea340e Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Mon, 13 Aug 2018 10:35:52 +0200
+Subject: [PATCH] Curl_ntlm_core_mk_nt_hash: return error on too long password
+
+... since it would cause an integer overflow if longer than (max size_t
+/ 2).
+
+This is CVE-2018-14618
+
+Bug: https://curl.haxx.se/docs/CVE-2018-14618.html
+Closes #2756
+Reported-by: Zhaoyang Wu
+
+Upstream-commit: 57d299a499155d4b327e341c6024e293b0418243
+Signed-off-by: Kamil Dudka
+---
+ lib/curl_ntlm_core.c | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
+index e896276..e5c785d 100644
+--- a/lib/curl_ntlm_core.c
++++ b/lib/curl_ntlm_core.c
+@@ -143,6 +143,15 @@
+ #define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"
+ #define NTLMv2_BLOB_LEN (44 -16 + ntlm->target_info_len + 4)
+
++#ifndef SIZE_T_MAX
++/* some limits.h headers have this defined, some don't */
++#if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
++#define SIZE_T_MAX 18446744073709551615U
++#else
++#define SIZE_T_MAX 4294967295U
++#endif
++#endif
++
+ /*
+ * Turns a 56-bit key into being 64-bit wide.
+ */
+@@ -557,8 +566,11 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
+ unsigned char *ntbuffer /* 21 bytes */)
+ {
+ size_t len = strlen(password);
+- unsigned char *pw = len ? malloc(len * 2) : strdup("");
++ unsigned char *pw;
+ CURLcode result;
++ if(len > SIZE_T_MAX/2) /* avoid integer overflow */
++ return CURLE_OUT_OF_MEMORY;
++ pw = len ? malloc(len * 2) : strdup("");
+ if(!pw)
+ return CURLE_OUT_OF_MEMORY;
+
+@@ -646,15 +658,6 @@ CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen,
+ return CURLE_OK;
+ }
+
+-#ifndef SIZE_T_MAX
+-/* some limits.h headers have this defined, some don't */
+-#if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
+-#define SIZE_T_MAX 18446744073709551615U
+-#else
+-#define SIZE_T_MAX 4294967295U
+-#endif
+-#endif
+-
+ /* This creates the NTLMv2 hash by using NTLM hash as the key and Unicode
+ * (uppercase UserName + Domain) as the data
+ */
+--
+2.17.1
+
diff --git a/curl.spec b/curl.spec
index c0d7575..b7041ad 100644
--- a/curl.spec
+++ b/curl.spec
@@ -26,6 +26,9 @@ Patch6: 0006-curl-7.59.0-pkcs11.patch
# scp/sftp: fix infinite connect loop on invalid private key (#1595135)
Patch7: 0007-curl-7.61.0-libssh.patch
+# fix NTLM password overflow via integer overflow (CVE-2018-14618)
+Patch8: 0008-curl-7.59.0-CVE-2018-14618.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -183,6 +186,7 @@ be installed.
%patch5 -p1
%patch6 -p1
%patch7 -p1
+%patch8 -p1
# Fedora patches
%patch101 -p1
@@ -330,6 +334,7 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%changelog
* Wed Sep 05 2018 Kamil Dudka - 7.59.0-7
+- fix NTLM password overflow via integer overflow (CVE-2018-14618)
- tests: make ssh-keygen always produce PEM format (#1622594)
- scp/sftp: fix infinite connect loop on invalid private key (#1595135)
From 6c95600feddc0b86189ebf037d2099ad84a94835 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 4 Oct 2018 15:40:31 +0200
Subject: [PATCH 09/14] test320: update expected output for gnutls-3.6.4
---
0009-curl-7.59.0-test320-gnutls.patch | 63 +++++++++++++++++++++++++++
curl.spec | 9 +++-
2 files changed, 71 insertions(+), 1 deletion(-)
create mode 100644 0009-curl-7.59.0-test320-gnutls.patch
diff --git a/0009-curl-7.59.0-test320-gnutls.patch b/0009-curl-7.59.0-test320-gnutls.patch
new file mode 100644
index 0000000..a9cbaac
--- /dev/null
+++ b/0009-curl-7.59.0-test320-gnutls.patch
@@ -0,0 +1,63 @@
+From 3cd5b375e31fb98e4782dc3a77e7316ad9eb26cf Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Thu, 4 Oct 2018 15:34:13 +0200
+Subject: [PATCH] test320: strip out more HTML when comparing
+
+To make the test case work with different gnutls-serv versions better.
+
+Reported-by: Kamil Dudka
+Fixes #3093
+Closes #3094
+
+Upstream-commit: 94ad57b0246b5658c2a9139dbe6a80efa4c4e2f3
+Signed-off-by: Kamil Dudka
+---
+ tests/data/test320 | 24 ++++--------------------
+ 1 file changed, 4 insertions(+), 20 deletions(-)
+
+diff --git a/tests/data/test320 b/tests/data/test320
+index 457a11eb2..87311d4f2 100644
+--- a/tests/data/test320
++++ b/tests/data/test320
+@@ -62,34 +62,18 @@ simple TLS-SRP HTTPS GET, check user in response
+ HTTP/1.0 200 OK
+ Content-type: text/html
+
+-
+-
+-
+-
+-
+-
+-If your browser supports session resuming, then you should see the same session ID, when you press the reload button.
+-Connected as user 'jsmith'.
+-
+-
|
+-| Key Exchange: | SRP |
+-| Compression | NULL |
+-| Cipher | AES-NNN-CBC |
+-| MAC | SHA1 |
+-| Ciphersuite | SRP_SHA_AES_NNN_CBC_SHA1 |
+-
Your HTTP header was:
Host: %HOSTIP:%HTTPTLSPORT
++FINE
+ User-Agent: curl-test-suite
+ Accept: */*
+
+-
+-
+-
+
+
+-s/^Session ID:.*//
++s/^
Connected as user 'jsmith'.*/FINE/
+ s/Protocol version:.*[0-9]//
+ s/GNUTLS/GnuTLS/
+ s/(AES[-_])\d\d\d([-_]CBC)/$1NNN$2/
++s/^<.*\n//
++s/^\n//
+
+
+
+--
+2.17.1
+
diff --git a/curl.spec b/curl.spec
index b7041ad..f031f2e 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 7%{?dist}
+Release: 8%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -29,6 +29,9 @@ Patch7: 0007-curl-7.61.0-libssh.patch
# fix NTLM password overflow via integer overflow (CVE-2018-14618)
Patch8: 0008-curl-7.59.0-CVE-2018-14618.patch
+# test320: update expected output for gnutls-3.6.4
+Patch9: 0009-curl-7.59.0-test320-gnutls.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -187,6 +190,7 @@ be installed.
%patch6 -p1
%patch7 -p1
%patch8 -p1
+%patch9 -p1
# Fedora patches
%patch101 -p1
@@ -333,6 +337,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Thu Nov 01 2018 Kamil Dudka - 7.59.0-8
+- test320: update expected output for gnutls-3.6.4
+
* Wed Sep 05 2018 Kamil Dudka - 7.59.0-7
- fix NTLM password overflow via integer overflow (CVE-2018-14618)
- tests: make ssh-keygen always produce PEM format (#1622594)
From 796d905297bafdca5ff3bbfb51bf57620b48227d Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 1 Nov 2018 09:45:48 +0100
Subject: [PATCH 10/14] Resolves: CVE-2018-16842 - fix bad arethmetic when
outputting warnings to stderr
Use `git apply` to apply the patch because `patch` would fail with:
File tests/data/test2080: git binary diffs are not supported.
---
0010-curl-7.59.0-CVE-2018-16842.patch | 78 +++++++++++++++++++++++++++
curl.spec | 7 +++
2 files changed, 85 insertions(+)
create mode 100644 0010-curl-7.59.0-CVE-2018-16842.patch
diff --git a/0010-curl-7.59.0-CVE-2018-16842.patch b/0010-curl-7.59.0-CVE-2018-16842.patch
new file mode 100644
index 0000000..6903ad6
--- /dev/null
+++ b/0010-curl-7.59.0-CVE-2018-16842.patch
@@ -0,0 +1,78 @@
+From 27d6c92acdac671ddf8f77f72956b2181561f774 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Sun, 28 Oct 2018 01:33:23 +0200
+Subject: [PATCH 1/2] voutf: fix bad arethmetic when outputting warnings to
+ stderr
+
+CVE-2018-16842
+Reported-by: Brian Carpenter
+Bug: https://curl.haxx.se/docs/CVE-2018-16842.html
+
+Upstream-commit: d530e92f59ae9bb2d47066c3c460b25d2ffeb211
+Signed-off-by: Kamil Dudka
+---
+ src/tool_msgs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tool_msgs.c b/src/tool_msgs.c
+index 9cce806..05bec39 100644
+--- a/src/tool_msgs.c
++++ b/src/tool_msgs.c
+@@ -67,7 +67,7 @@ static void voutf(struct GlobalConfig *config,
+ (void)fwrite(ptr, cut + 1, 1, config->errors);
+ fputs("\n", config->errors);
+ ptr += cut + 1; /* skip the space too */
+- len -= cut;
++ len -= cut + 1;
+ }
+ else {
+ fputs(ptr, config->errors);
+--
+2.17.2
+
+
+From 23f8c641b02e6c302d0e8cc5a5ee225a33b01f28 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Sun, 28 Oct 2018 10:43:57 +0100
+Subject: [PATCH 2/2] test2080: verify the fix for CVE-2018-16842
+
+Upstream-commit: 350306e4726b71b5b386fc30e3fecc039a807157
+Signed-off-by: Kamil Dudka
+---
+ tests/data/Makefile.inc | 3 ++-
+ tests/data/test2080 | Bin 0 -> 20659 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+ create mode 100644 tests/data/test2080
+
+diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
+index e045748..aa5fff0 100644
+--- a/tests/data/Makefile.inc
++++ b/tests/data/Makefile.inc
+@@ -194,4 +194,5 @@ test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
+ test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
+ test2064 test2065 test2066 test2067 test2068 test2069 \
+ \
+-test2070 test2071 test2072 test2073
++test2070 test2071 test2072 test2073 \
++test2080
+diff --git a/tests/data/test2080 b/tests/data/test2080
+new file mode 100644
+index 0000000000000000000000000000000000000000..47e376ecb5d7879c0a98e392bff48ccc52e9db0a
+GIT binary patch
+literal 20659
+zcmeI)Pj3@35QkyT{uI*`iBshYE(n>u@JB+F3kdG+t~asjwJY0gl}``eO+)FONU8ef
+zl6Ca+%A4K8~qdz
+zd{+G6l*#ToY+DU||F9%J1n*+KPxQ;7MapuoQ!&MMQSXmpqMh0_yS6g=;N;HNjilBk
+zY$c?)mULZxib{;$g~jw~nrs|8b@sJI)_QmS_4(WLrNld}2Y0LEO$e>m->_NA&o$n!
+z9^YDZ>cvMs2q1s}0tg_000PG)@a?$9VHyMwKmY**5I_I{1Q0m1z~!MEP#*yV5I_I{
+z1Q0*~0R#|0009ILKmY**4ldvh-hl=PAb-+Xw`j-8D
+zzg+g?Rt8(G*s;1Sb>n1S94H%G - 7.59.0-8
+- fix bad arethmetic when outputting warnings to stderr (CVE-2018-16842)
- test320: update expected output for gnutls-3.6.4
* Wed Sep 05 2018 Kamil Dudka - 7.59.0-7
From 00c5d944d93e5ca4efc1776ec1419f79c1cb05f7 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 1 Nov 2018 09:59:22 +0100
Subject: [PATCH 11/14] Resolves: CVE-2018-16840 - fix use-after-free in handle
close
---
0011-curl-7.59.0-CVE-2018-16840.patch | 39 +++++++++++++++++++++++++++
curl.spec | 5 ++++
2 files changed, 44 insertions(+)
create mode 100644 0011-curl-7.59.0-CVE-2018-16840.patch
diff --git a/0011-curl-7.59.0-CVE-2018-16840.patch b/0011-curl-7.59.0-CVE-2018-16840.patch
new file mode 100644
index 0000000..43f5eb2
--- /dev/null
+++ b/0011-curl-7.59.0-CVE-2018-16840.patch
@@ -0,0 +1,39 @@
+From 235f209a0e62edee654be441a50bb0c154edeaa5 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Thu, 18 Oct 2018 15:07:15 +0200
+Subject: [PATCH] Curl_close: clear data->multi_easy on free to avoid
+ use-after-free
+
+Regression from b46cfbc068 (7.59.0)
+CVE-2018-16840
+Reported-by: Brian Carpenter (Geeknik Labs)
+
+Bug: https://curl.haxx.se/docs/CVE-2018-16840.html
+
+Upstream-commit: 81d135d67155c5295b1033679c606165d4e28f3f
+Signed-off-by: Kamil Dudka
+---
+ lib/url.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/lib/url.c b/lib/url.c
+index f159008..dcc1ecc 100644
+--- a/lib/url.c
++++ b/lib/url.c
+@@ -320,10 +320,12 @@ CURLcode Curl_close(struct Curl_easy *data)
+ and detach this handle from there. */
+ curl_multi_remove_handle(data->multi, data);
+
+- if(data->multi_easy)
++ if(data->multi_easy) {
+ /* when curl_easy_perform() is used, it creates its own multi handle to
+ use and this is the one */
+ curl_multi_cleanup(data->multi_easy);
++ data->multi_easy = NULL;
++ }
+
+ /* Destroy the timeout list that is held in the easy handle. It is
+ /normally/ done by curl_multi_remove_handle() but this is "just in
+--
+2.17.2
+
diff --git a/curl.spec b/curl.spec
index 43e035e..6cd55a8 100644
--- a/curl.spec
+++ b/curl.spec
@@ -37,6 +37,9 @@ Patch10: 0010-curl-7.59.0-CVE-2018-16842.patch
# we need `git apply` to apply this patch
BuildRequires: git
+# fix use-after-free in handle close (CVE-2018-16840)
+Patch11: 0011-curl-7.59.0-CVE-2018-16840.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -197,6 +200,7 @@ be installed.
%patch8 -p1
%patch9 -p1
git apply %{PATCH10}
+%patch11 -p1
# Fedora patches
%patch101 -p1
@@ -344,6 +348,7 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%changelog
* Thu Nov 01 2018 Kamil Dudka - 7.59.0-8
+- fix use-after-free in handle close (CVE-2018-16840)
- fix bad arethmetic when outputting warnings to stderr (CVE-2018-16842)
- test320: update expected output for gnutls-3.6.4
From a1bd4f84de03b8d4f0f1c65acba7914cd9c601ce Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 1 Nov 2018 10:07:35 +0100
Subject: [PATCH 12/14] Resolves: CVE-2018-16839 - SASL password overflow via
integer overflow
---
0012-curl-7.59.0-CVE-2018-16839.patch | 136 ++++++++++++++++++++++++++
curl.spec | 5 +
2 files changed, 141 insertions(+)
create mode 100644 0012-curl-7.59.0-CVE-2018-16839.patch
diff --git a/0012-curl-7.59.0-CVE-2018-16839.patch b/0012-curl-7.59.0-CVE-2018-16839.patch
new file mode 100644
index 0000000..5570f44
--- /dev/null
+++ b/0012-curl-7.59.0-CVE-2018-16839.patch
@@ -0,0 +1,136 @@
+From 4df8ff21144236497fc92521d79fbca2dc079686 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Tue, 20 Mar 2018 15:15:14 +0100
+Subject: [PATCH 1/2] vauth/cleartext: fix integer overflow check
+
+Make the integer overflow check not rely on the undefined behavior that
+a size_t wraps around on overflow.
+
+Detected by lgtm.com
+Closes #2408
+
+Upstream-commit: c1366571b609407cf0d4d9f4a2769d29e1313151
+Signed-off-by: Kamil Dudka
+---
+ lib/curl_ntlm_core.c | 11 +----------
+ lib/curl_setup.h | 9 +++++++++
+ lib/vauth/cleartext.c | 14 ++++----------
+ 3 files changed, 14 insertions(+), 20 deletions(-)
+
+diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
+index e5c785d..b69c293 100644
+--- a/lib/curl_ntlm_core.c
++++ b/lib/curl_ntlm_core.c
+@@ -5,7 +5,7 @@
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+- * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al.
++ * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+@@ -143,15 +143,6 @@
+ #define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"
+ #define NTLMv2_BLOB_LEN (44 -16 + ntlm->target_info_len + 4)
+
+-#ifndef SIZE_T_MAX
+-/* some limits.h headers have this defined, some don't */
+-#if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
+-#define SIZE_T_MAX 18446744073709551615U
+-#else
+-#define SIZE_T_MAX 4294967295U
+-#endif
+-#endif
+-
+ /*
+ * Turns a 56-bit key into being 64-bit wide.
+ */
+diff --git a/lib/curl_setup.h b/lib/curl_setup.h
+index f128696..e4503c6 100644
+--- a/lib/curl_setup.h
++++ b/lib/curl_setup.h
+@@ -447,6 +447,15 @@
+ # endif
+ #endif
+
++#ifndef SIZE_T_MAX
++/* some limits.h headers have this defined, some don't */
++#if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
++#define SIZE_T_MAX 18446744073709551615U
++#else
++#define SIZE_T_MAX 4294967295U
++#endif
++#endif
++
+ /*
+ * Arg 2 type for gethostname in case it hasn't been defined in config file.
+ */
+diff --git a/lib/vauth/cleartext.c b/lib/vauth/cleartext.c
+index a761ae7..5d61ce6 100644
+--- a/lib/vauth/cleartext.c
++++ b/lib/vauth/cleartext.c
+@@ -5,7 +5,7 @@
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+- * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al.
++ * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+@@ -73,16 +73,10 @@ CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
+ ulen = strlen(userp);
+ plen = strlen(passwdp);
+
+- /* Compute binary message length, checking for overflows. */
+- plainlen = 2 * ulen;
+- if(plainlen < ulen)
+- return CURLE_OUT_OF_MEMORY;
+- plainlen += plen;
+- if(plainlen < plen)
+- return CURLE_OUT_OF_MEMORY;
+- plainlen += 2;
+- if(plainlen < 2)
++ /* Compute binary message length. Check for overflows. */
++ if((ulen > SIZE_T_MAX/2) || (plen > (SIZE_T_MAX/2 - 2)))
+ return CURLE_OUT_OF_MEMORY;
++ plainlen = 2 * ulen + plen + 2;
+
+ plainauth = malloc(plainlen);
+ if(!plainauth)
+--
+2.17.2
+
+
+From ad9943254ded9a983af7d581e8a1f3317e8a8781 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg
+Date: Fri, 28 Sep 2018 16:08:16 +0200
+Subject: [PATCH 2/2] Curl_auth_create_plain_message: fix too-large-input-check
+
+CVE-2018-16839
+Reported-by: Harry Sintonen
+Bug: https://curl.haxx.se/docs/CVE-2018-16839.html
+
+Upstream-commit: f3a24d7916b9173c69a3e0ee790102993833d6c5
+Signed-off-by: Kamil Dudka
+---
+ lib/vauth/cleartext.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/vauth/cleartext.c b/lib/vauth/cleartext.c
+index 5d61ce6..1367143 100644
+--- a/lib/vauth/cleartext.c
++++ b/lib/vauth/cleartext.c
+@@ -74,7 +74,7 @@ CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
+ plen = strlen(passwdp);
+
+ /* Compute binary message length. Check for overflows. */
+- if((ulen > SIZE_T_MAX/2) || (plen > (SIZE_T_MAX/2 - 2)))
++ if((ulen > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
+ return CURLE_OUT_OF_MEMORY;
+ plainlen = 2 * ulen + plen + 2;
+
+--
+2.17.2
+
diff --git a/curl.spec b/curl.spec
index 6cd55a8..d26bec3 100644
--- a/curl.spec
+++ b/curl.spec
@@ -40,6 +40,9 @@ BuildRequires: git
# fix use-after-free in handle close (CVE-2018-16840)
Patch11: 0011-curl-7.59.0-CVE-2018-16840.patch
+# SASL password overflow via integer overflow (CVE-2018-16839)
+Patch12: 0012-curl-7.59.0-CVE-2018-16839.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -201,6 +204,7 @@ be installed.
%patch9 -p1
git apply %{PATCH10}
%patch11 -p1
+%patch12 -p1
# Fedora patches
%patch101 -p1
@@ -348,6 +352,7 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%changelog
* Thu Nov 01 2018 Kamil Dudka - 7.59.0-8
+- SASL password overflow via integer overflow (CVE-2018-16839)
- fix use-after-free in handle close (CVE-2018-16840)
- fix bad arethmetic when outputting warnings to stderr (CVE-2018-16842)
- test320: update expected output for gnutls-3.6.4
From 58646f29ccd62a0703ed6cd56ca854328ca0b817 Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Thu, 15 Nov 2018 15:32:09 +0100
Subject: [PATCH 13/14] Resolves: CVE-2018-16842 - make the patch for
CVE-2018-16842 apply properly
`git apply` fails silently unless `git init` is invoked first.
---
curl.spec | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/curl.spec b/curl.spec
index d26bec3..337ec68 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 8%{?dist}
+Release: 9%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -202,6 +202,7 @@ be installed.
%patch7 -p1
%patch8 -p1
%patch9 -p1
+git init
git apply %{PATCH10}
%patch11 -p1
%patch12 -p1
@@ -351,6 +352,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Thu Nov 15 2018 Kamil Dudka - 7.59.0-9
+- make the patch for CVE-2018-16842 apply properly (CVE-2018-16842)
+
* Thu Nov 01 2018 Kamil Dudka - 7.59.0-8
- SASL password overflow via integer overflow (CVE-2018-16839)
- fix use-after-free in handle close (CVE-2018-16840)
From 77901fea1dce2a28df17ec8a623709f82d4f307d Mon Sep 17 00:00:00 2001
From: Kamil Dudka
Date: Mon, 11 Feb 2019 13:22:07 +0100
Subject: [PATCH 14/14] make zsh completion work again
---
0013-curl-7.61.1-zsh-completion.patch | 76 +++++++++++++++++++++++++++
curl.spec | 9 +++-
2 files changed, 84 insertions(+), 1 deletion(-)
create mode 100644 0013-curl-7.61.1-zsh-completion.patch
diff --git a/0013-curl-7.61.1-zsh-completion.patch b/0013-curl-7.61.1-zsh-completion.patch
new file mode 100644
index 0000000..770a15b
--- /dev/null
+++ b/0013-curl-7.61.1-zsh-completion.patch
@@ -0,0 +1,76 @@
+From 082034e2334b2d0795b2b324ff3e0635bb7d2b86 Mon Sep 17 00:00:00 2001
+From: Alessandro Ghedini
+Date: Tue, 5 Feb 2019 20:44:14 +0000
+Subject: [PATCH 1/2] zsh.pl: update regex to better match curl -h output
+
+The current regex fails to match '<...>' arguments properly (e.g. those
+with spaces in them), which causes an completion script with wrong
+descriptions for some options.
+
+The problem can be reproduced as follows:
+
+% curl --reso
+
+Upstream-commit: dbd32f3241b297b96ee11a51da1a661f528ca026
+Signed-off-by: Kamil Dudka
+---
+ scripts/zsh.pl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/scripts/zsh.pl b/scripts/zsh.pl
+index 1257190..941b322 100755
+--- a/scripts/zsh.pl
++++ b/scripts/zsh.pl
+@@ -7,7 +7,7 @@ use warnings;
+
+ my $curl = $ARGV[0] || 'curl';
+
+-my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s([^\s.]+)?\s+(.*)';
++my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s*(\<.+?\>)?\s+(.*)';
+ my @opts = parse_main_opts('--help', $regex);
+
+ my $opts_str;
+--
+2.17.2
+
+
+From 45abc785e101346f19599aa5f9fa1617e525ec4d Mon Sep 17 00:00:00 2001
+From: Alessandro Ghedini
+Date: Tue, 5 Feb 2019 21:06:26 +0000
+Subject: [PATCH 2/2] zsh.pl: escape ':' character
+
+':' is interpreted as separator by zsh, so if used as part of the argument
+or option's description it needs to be escaped.
+
+The problem can be reproduced as follows:
+
+% curl -E
+
+Bug: https://bugs.debian.org/921452
+
+Upstream-commit: b3cc8017b7364f588365be2b2629c49c142efdb7
+Signed-off-by: Kamil Dudka
+---
+ scripts/zsh.pl | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/scripts/zsh.pl b/scripts/zsh.pl
+index 941b322..0f9cbec 100755
+--- a/scripts/zsh.pl
++++ b/scripts/zsh.pl
+@@ -45,9 +45,12 @@ sub parse_main_opts {
+
+ my $option = '';
+
++ $arg =~ s/\:/\\\:/g if defined $arg;
++
+ $desc =~ s/'/'\\''/g if defined $desc;
+ $desc =~ s/\[/\\\[/g if defined $desc;
+ $desc =~ s/\]/\\\]/g if defined $desc;
++ $desc =~ s/\:/\\\:/g if defined $desc;
+
+ $option .= '{' . trim($short) . ',' if defined $short;
+ $option .= trim($long) if defined $long;
+--
+2.17.2
+
diff --git a/curl.spec b/curl.spec
index 337ec68..ad34021 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.59.0
-Release: 9%{?dist}
+Release: 10%{?dist}
License: MIT
Source: https://curl.haxx.se/download/%{name}-%{version}.tar.xz
@@ -43,6 +43,9 @@ Patch11: 0011-curl-7.59.0-CVE-2018-16840.patch
# SASL password overflow via integer overflow (CVE-2018-16839)
Patch12: 0012-curl-7.59.0-CVE-2018-16839.patch
+# make zsh completion work again
+Patch13: 0013-curl-7.61.1-zsh-completion.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.32.0-multilib.patch
@@ -206,6 +209,7 @@ git init
git apply %{PATCH10}
%patch11 -p1
%patch12 -p1
+%patch13 -p1
# Fedora patches
%patch101 -p1
@@ -352,6 +356,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
%changelog
+* Mon Feb 11 2019 Kamil Dudka - 7.61.1-10
+- make zsh completion work again
+
* Thu Nov 15 2018 Kamil Dudka - 7.59.0-9
- make the patch for CVE-2018-16842 apply properly (CVE-2018-16842)