yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-block-Call-attention-to-truncation-of-long-NBD-expor.patch

77c23f
From c8ecaea34f03b8ddda7d2b41b0d6f397469c8959 Mon Sep 17 00:00:00 2001
77c23f
From: Eric Blake <eblake@redhat.com>
77c23f
Date: Wed, 10 Jun 2020 18:32:02 -0400
77c23f
Subject: [PATCH 2/2] block: Call attention to truncation of long NBD exports
77c23f
77c23f
RH-Author: Eric Blake <eblake@redhat.com>
77c23f
Message-id: <20200610183202.3780750-3-eblake@redhat.com>
77c23f
Patchwork-id: 97495
77c23f
O-Subject: [RHEL-AV-8.2.1 qemu-kvm PATCH 2/2] block: Call attention to truncation of long NBD exports
77c23f
Bugzilla: 1845384
77c23f
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
77c23f
RH-Acked-by: Max Reitz <mreitz@redhat.com>
77c23f
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
77c23f
77c23f
Commit 93676c88 relaxed our NBD client code to request export names up
77c23f
to the NBD protocol maximum of 4096 bytes without NUL terminator, even
77c23f
though the block layer can't store anything longer than 4096 bytes
77c23f
including NUL terminator for display to the user.  Since this means
77c23f
there are some export names where we have to truncate things, we can
77c23f
at least try to make the truncation a bit more obvious for the user.
77c23f
Note that in spite of the truncated display name, we can still
77c23f
communicate with an NBD server using such a long export name; this was
77c23f
deemed nicer than refusing to even connect to such a server (since the
77c23f
server may not be under our control, and since determining our actual
77c23f
length limits gets tricky when nbd://host:port/export and
77c23f
nbd+unix:///export?socket=/path are themselves variable-length
77c23f
expansions beyond the export name but count towards the block layer
77c23f
name length).
77c23f
77c23f
Reported-by: Xueqiang Wei <xuwei@redhat.com>
77c23f
Fixes: https://bugzilla.redhat.com/1843684
77c23f
Signed-off-by: Eric Blake <eblake@redhat.com>
77c23f
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
77c23f
Message-Id: <20200610163741.3745251-3-eblake@redhat.com>
77c23f
(cherry picked from commit 5c86bdf1208916ece0b87e1151c9b48ee54faa3e)
77c23f
Signed-off-by: Eric Blake <eblake@redhat.com>
77c23f
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
77c23f
---
77c23f
 block.c     |  7 +++++--
77c23f
 block/nbd.c | 21 +++++++++++++--------
77c23f
 2 files changed, 18 insertions(+), 10 deletions(-)
77c23f
77c23f
diff --git a/block.c b/block.c
77c23f
index 12c8941879..57740d312e 100644
77c23f
--- a/block.c
77c23f
+++ b/block.c
77c23f
@@ -6683,8 +6683,11 @@ void bdrv_refresh_filename(BlockDriverState *bs)
77c23f
         pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename);
77c23f
     } else {
77c23f
         QString *json = qobject_to_json(QOBJECT(bs->full_open_options));
77c23f
-        snprintf(bs->filename, sizeof(bs->filename), "json:%s",
77c23f
-                 qstring_get_str(json));
77c23f
+        if (snprintf(bs->filename, sizeof(bs->filename), "json:%s",
77c23f
+                     qstring_get_str(json)) >= sizeof(bs->filename)) {
77c23f
+            /* Give user a hint if we truncated things. */
77c23f
+            strcpy(bs->filename + sizeof(bs->filename) - 4, "...");
77c23f
+        }
77c23f
         qobject_unref(json);
77c23f
     }
77c23f
 }
77c23f
diff --git a/block/nbd.c b/block/nbd.c
77c23f
index 927915d93d..5bb154017d 100644
77c23f
--- a/block/nbd.c
77c23f
+++ b/block/nbd.c
77c23f
@@ -1978,6 +1978,7 @@ static void nbd_refresh_filename(BlockDriverState *bs)
77c23f
 {
77c23f
     BDRVNBDState *s = bs->opaque;
77c23f
     const char *host = NULL, *port = NULL, *path = NULL;
77c23f
+    size_t len = 0;
77c23f
 
77c23f
     if (s->saddr->type == SOCKET_ADDRESS_TYPE_INET) {
77c23f
         const InetSocketAddress *inet = &s->saddr->u.inet;
77c23f
@@ -1990,17 +1991,21 @@ static void nbd_refresh_filename(BlockDriverState *bs)
77c23f
     } /* else can't represent as pseudo-filename */
77c23f
 
77c23f
     if (path && s->export) {
77c23f
-        snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
-                 "nbd+unix:///%s?socket=%s", s->export, path);
77c23f
+        len = snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
+                       "nbd+unix:///%s?socket=%s", s->export, path);
77c23f
     } else if (path && !s->export) {
77c23f
-        snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
-                 "nbd+unix://?socket=%s", path);
77c23f
+        len = snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
+                       "nbd+unix://?socket=%s", path);
77c23f
     } else if (host && s->export) {
77c23f
-        snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
-                 "nbd://%s:%s/%s", host, port, s->export);
77c23f
+        len = snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
+                       "nbd://%s:%s/%s", host, port, s->export);
77c23f
     } else if (host && !s->export) {
77c23f
-        snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
-                 "nbd://%s:%s", host, port);
77c23f
+        len = snprintf(bs->exact_filename, sizeof(bs->exact_filename),
77c23f
+                       "nbd://%s:%s", host, port);
77c23f
+    }
77c23f
+    if (len > sizeof(bs->exact_filename)) {
77c23f
+        /* Name is too long to represent exactly, so leave it empty. */
77c23f
+        bs->exact_filename[0] = '\0';
77c23f
     }
77c23f
 }
77c23f
 
77c23f
-- 
77c23f
2.27.0
77c23f