All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] curl: Operate on zero-length file
@ 2016-07-08 11:18 Tomáš Golembiovský
  2016-09-14  7:13 ` Michael Tokarev
  0 siblings, 1 reply; 2+ messages in thread
From: Tomáš Golembiovský @ 2016-07-08 11:18 UTC (permalink / raw)
  To: qemu-devel, qemu-trivial, qemu-block

Another attempt to fix the bug 1596870.

When creating new disk backed by remote file accessed via HTTPS and the
backing file has zero length, qemu-img terminates with uniformative
error message:

    qemu-img: disk.qcow2: CURL: Error opening file:

While it may not make much sense to operate on empty file, other block
backends (e.g. raw backend for regular files) seem to allow it. This
patch fixes it for the curl backend and improves the reported error.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
---
 block/curl.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/block/curl.c b/block/curl.c
index da9f5e8..a8cdb44 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -675,11 +675,28 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
     curl_easy_setopt(state->curl, CURLOPT_HEADERDATA, s);
     if (curl_easy_perform(state->curl))
         goto out;
-    curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d);
-    if (d)
-        s->len = (size_t)d;
-    else if(!s->len)
+    if (curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d)) {
         goto out;
+    }
+    /* 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 realy zero-length file. */
+#if LIBCURL_VERSION_NUM >= 0x071304
+    if (d < 0) {
+        pstrcpy(state->errmsg, CURL_ERROR_SIZE,
+                "Server didn't report file size.");
+        goto out;
+    }
+#else
+    if (d <= 0) {
+        pstrcpy(state->errmsg, CURL_ERROR_SIZE,
+                "Unknown file size or zero-length file.");
+        goto out;
+    }
+#endif
+
+    s->len = (size_t)d;
+
     if ((!strncasecmp(s->url, "http://", strlen("http://"))
         || !strncasecmp(s->url, "https://", strlen("https://")))
         && !s->accept_range) {
-- 
2.9.0


-- 
Tomáš Golembiovský <tgolembi@redhat.com>

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH v2] curl: Operate on zero-length file
  2016-07-08 11:18 [Qemu-devel] [PATCH v2] curl: Operate on zero-length file Tomáš Golembiovský
@ 2016-09-14  7:13 ` Michael Tokarev
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Tokarev @ 2016-09-14  7:13 UTC (permalink / raw)
  To: Tomáš Golembiovský, qemu-devel, qemu-trivial, qemu-block

08.07.2016 14:18, Tomáš Golembiovský wrote:
> Another attempt to fix the bug 1596870.
>
> When creating new disk backed by remote file accessed via HTTPS and the
> backing file has zero length, qemu-img terminates with uniformative
> error message:
>
>     qemu-img: disk.qcow2: CURL: Error opening file:
>
> While it may not make much sense to operate on empty file, other block
> backends (e.g. raw backend for regular files) seem to allow it. This
> patch fixes it for the curl backend and improves the reported error.
>
> Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
> ---
>  block/curl.c | 25 +++++++++++++++++++++----
>  1 file changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/block/curl.c b/block/curl.c
> index da9f5e8..a8cdb44 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -675,11 +675,28 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
>      curl_easy_setopt(state->curl, CURLOPT_HEADERDATA, s);
>      if (curl_easy_perform(state->curl))
>          goto out;
> -    curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d);
> -    if (d)
> -        s->len = (size_t)d;
> -    else if(!s->len)
> +    if (curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d)) {
>          goto out;
> +    }
> +    /* 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 realy zero-length file. */
> +#if LIBCURL_VERSION_NUM >= 0x071304
> +    if (d < 0) {
> +        pstrcpy(state->errmsg, CURL_ERROR_SIZE,
> +                "Server didn't report file size.");
> +        goto out;
> +    }
> +#else
> +    if (d <= 0) {
> +        pstrcpy(state->errmsg, CURL_ERROR_SIZE,
> +                "Unknown file size or zero-length file.");
> +        goto out;
> +    }
> +#endif

This is somewhat ugly ifdeffery, but ohwell..

> +    s->len = (size_t)d;
> +
>      if ((!strncasecmp(s->url, "http://", strlen("http://"))
>          || !strncasecmp(s->url, "https://", strlen("https://")))
>          && !s->accept_range) {
>


Applied to -trivial, thank you!

/mjt

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-09-14  7:13 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-08 11:18 [Qemu-devel] [PATCH v2] curl: Operate on zero-length file Tomáš Golembiovský
2016-09-14  7:13 ` Michael Tokarev

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.