123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- From 88d4ac032fa3d424fa3f8ac93f4ffd07022c19d6 Mon Sep 17 00:00:00 2001
- From: Anton Johansson <anjo@rev.ng>
- Date: Mon, 23 Jan 2023 21:14:31 +0100
- Subject: [PATCH 6/6] block: Handle curl 7.55.0, 7.85.0 version changes
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- * 7.55.0 deprecates CURLINFO_CONTENT_LENGTH_DOWNLOAD in favour of a *_T
- version, which returns curl_off_t instead of a double.
- * 7.85.0 deprecates CURLOPT_PROTOCOLS and CURLOPT_REDIR_PROTOCOLS in
- favour of *_STR variants, specifying the desired protocols via a
- string.
- Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1440
- Signed-off-by: Anton Johansson <anjo@rev.ng>
- Message-Id: <20230123201431.23118-1-anjo@rev.ng>
- Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
- Reviewed-by: Kevin Wolf <kwolf@redhat.com>
- Signed-off-by: Kevin Wolf <kwolf@redhat.com>
- ---
- block/curl.c | 44 +++++++++++++++++++++++++++++++++++++-------
- 1 file changed, 37 insertions(+), 7 deletions(-)
- diff --git a/block/curl.c b/block/curl.c
- index cba4c4cac7..0b125095e3 100644
- --- a/block/curl.c
- +++ b/block/curl.c
- @@ -37,8 +37,15 @@
-
- // #define DEBUG_VERBOSE
-
- +/* CURL 7.85.0 switches to a string based API for specifying
- + * the desired protocols.
- + */
- +#if LIBCURL_VERSION_NUM >= 0x075500
- +#define PROTOCOLS "HTTP,HTTPS,FTP,FTPS"
- +#else
- #define PROTOCOLS (CURLPROTO_HTTP | CURLPROTO_HTTPS | \
- CURLPROTO_FTP | CURLPROTO_FTPS)
- +#endif
-
- #define CURL_NUM_STATES 8
- #define CURL_NUM_ACB 8
- @@ -509,9 +516,18 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state)
- * obscure protocols. For example, do not allow POP3/SMTP/IMAP see
- * CVE-2013-0249.
- *
- - * Restricting protocols is only supported from 7.19.4 upwards.
- + * Restricting protocols is only supported from 7.19.4 upwards. Note:
- + * version 7.85.0 deprecates CURLOPT_*PROTOCOLS in favour of a string
- + * based CURLOPT_*PROTOCOLS_STR API.
- */
- -#if LIBCURL_VERSION_NUM >= 0x071304
- +#if LIBCURL_VERSION_NUM >= 0x075500
- + if (curl_easy_setopt(state->curl,
- + CURLOPT_PROTOCOLS_STR, PROTOCOLS) ||
- + curl_easy_setopt(state->curl,
- + CURLOPT_REDIR_PROTOCOLS_STR, PROTOCOLS)) {
- + goto err;
- + }
- +#elif LIBCURL_VERSION_NUM >= 0x071304
- if (curl_easy_setopt(state->curl, CURLOPT_PROTOCOLS, PROTOCOLS) ||
- curl_easy_setopt(state->curl, CURLOPT_REDIR_PROTOCOLS, PROTOCOLS)) {
- goto err;
- @@ -669,7 +685,12 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
- const char *file;
- const char *cookie;
- const char *cookie_secret;
- - double d;
- + /* CURL >= 7.55.0 uses curl_off_t for content length instead of a double */
- +#if LIBCURL_VERSION_NUM >= 0x073700
- + curl_off_t cl;
- +#else
- + double cl;
- +#endif
- const char *secretid;
- const char *protocol_delimiter;
- int ret;
- @@ -796,27 +817,36 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
- }
- if (curl_easy_perform(state->curl))
- goto out;
- - if (curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d)) {
- + /* CURL 7.55.0 deprecates CURLINFO_CONTENT_LENGTH_DOWNLOAD in favour of
- + * the *_T version which returns a more sensible type for content length.
- + */
- +#if LIBCURL_VERSION_NUM >= 0x073700
- + if (curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &cl)) {
- + goto out;
- + }
- +#else
- + if (curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &cl)) {
- goto out;
- }
- +#endif
- /* Prior CURL 7.19.4 return value of 0 could mean that the file size is not
- * know or the size is zero. From 7.19.4 CURL returns -1 if size is not
- * known and zero if it is really zero-length file. */
- #if LIBCURL_VERSION_NUM >= 0x071304
- - if (d < 0) {
- + if (cl < 0) {
- pstrcpy(state->errmsg, CURL_ERROR_SIZE,
- "Server didn't report file size.");
- goto out;
- }
- #else
- - if (d <= 0) {
- + if (cl <= 0) {
- pstrcpy(state->errmsg, CURL_ERROR_SIZE,
- "Unknown file size or zero-length file.");
- goto out;
- }
- #endif
-
- - s->len = d;
- + s->len = cl;
-
- if ((!strncasecmp(s->url, "http://", strlen("http://"))
- || !strncasecmp(s->url, "https://", strlen("https://")))
- --
- 2.25.1
|