qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename
@ 2021-04-21 21:23 Connor Kuehl
  2021-04-21 21:23 ` [PATCH v4 1/2] iotests/231: Update expected deprecation message Connor Kuehl
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Connor Kuehl @ 2021-04-21 21:23 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, sgarzare, qemu-devel, mreitz

Connor Kuehl (2):
  iotests/231: Update expected deprecation message
  block/rbd: Add an escape-aware strchr helper

 block/rbd.c                | 32 +++++++++++++++++++++-----------
 tests/qemu-iotests/231     |  4 ++++
 tests/qemu-iotests/231.out |  7 ++++---
 3 files changed, 29 insertions(+), 14 deletions(-)

-- 
2.30.2



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

* [PATCH v4 1/2] iotests/231: Update expected deprecation message
  2021-04-21 21:23 [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Connor Kuehl
@ 2021-04-21 21:23 ` Connor Kuehl
  2021-04-21 21:23 ` [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper Connor Kuehl
  2021-04-22 12:32 ` [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Max Reitz
  2 siblings, 0 replies; 5+ messages in thread
From: Connor Kuehl @ 2021-04-21 21:23 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, sgarzare, qemu-devel, mreitz

The deprecation message in the expected output has technically been
wrong since the wrong version of a patch was applied to it. Because of
this, the test fails. Correct the expected output so that it passes.

Signed-off-by: Connor Kuehl <ckuehl@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
---
v3 -> v4:
  * Added Stefano's s-o-b to the commit message

 tests/qemu-iotests/231.out | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/tests/qemu-iotests/231.out b/tests/qemu-iotests/231.out
index 579ba11c16..747dd221bb 100644
--- a/tests/qemu-iotests/231.out
+++ b/tests/qemu-iotests/231.out
@@ -1,9 +1,7 @@
 QA output created by 231
-qemu-img: RBD options encoded in the filename as keyvalue pairs is deprecated.  Future versions may cease to parse these options in the future.
+qemu-img: warning: RBD options encoded in the filename as keyvalue pairs is deprecated
 unable to get monitor info from DNS SRV with service name: ceph-mon
-no monitors specified to connect to.
 qemu-img: Could not open 'json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=BOGUS_CONF'}': error connecting: No such file or directory
 unable to get monitor info from DNS SRV with service name: ceph-mon
-no monitors specified to connect to.
 qemu-img: Could not open 'json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'BOGUS_CONF'}': error connecting: No such file or directory
 *** done
-- 
2.30.2



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

* [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper
  2021-04-21 21:23 [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Connor Kuehl
  2021-04-21 21:23 ` [PATCH v4 1/2] iotests/231: Update expected deprecation message Connor Kuehl
@ 2021-04-21 21:23 ` Connor Kuehl
  2021-04-22  7:12   ` Stefano Garzarella
  2021-04-22 12:32 ` [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Max Reitz
  2 siblings, 1 reply; 5+ messages in thread
From: Connor Kuehl @ 2021-04-21 21:23 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, sgarzare, qemu-devel, mreitz

Sometimes the parser needs to further split a token it has collected
from the token input stream. Right now, it does a cursory check to see
if the relevant characters appear in the token to determine if it should
break it down further.

However, qemu_rbd_next_tok() will escape characters as it removes tokens
from the token stream and plain strchr() won't. This can make the
initial strchr() check slightly misleading since it implies
qemu_rbd_next_tok() will find the token and split on it, except the
reality is that qemu_rbd_next_tok() will pass over it if it is escaped.

Use a custom strchr to avoid mixing escaped and unescaped string
operations. Furthermore, this code is identical to how
qemu_rbd_next_tok() seeks its next token, so incorporate this custom
strchr into the body of that function to reduce duplication.

Reported-by: Han Han <hhan@redhat.com>
Fixes: https://bugzilla.redhat.com/1873913
Signed-off-by: Connor Kuehl <ckuehl@redhat.com>
---
v3 -> v4:
  * Replace qemu_rbd_next_tok() seek loop with qemu_rbd_strchr() since
    they're identical

 block/rbd.c                | 32 +++++++++++++++++++++-----------
 tests/qemu-iotests/231     |  4 ++++
 tests/qemu-iotests/231.out |  3 +++
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/block/rbd.c b/block/rbd.c
index f098a89c7b..26f64cce7c 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -113,21 +113,31 @@ static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
                             const char *keypairs, const char *secretid,
                             Error **errp);
 
+static char *qemu_rbd_strchr(char *src, char delim)
+{
+    char *p;
+
+    for (p = src; *p; ++p) {
+        if (*p == delim) {
+            return p;
+        }
+        if (*p == '\\' && p[1] != '\0') {
+            ++p;
+        }
+    }
+
+    return NULL;
+}
+
+
 static char *qemu_rbd_next_tok(char *src, char delim, char **p)
 {
     char *end;
 
     *p = NULL;
 
-    for (end = src; *end; ++end) {
-        if (*end == delim) {
-            break;
-        }
-        if (*end == '\\' && end[1] != '\0') {
-            end++;
-        }
-    }
-    if (*end == delim) {
+    end = qemu_rbd_strchr(src, delim);
+    if (end) {
         *p = end + 1;
         *end = '\0';
     }
@@ -171,7 +181,7 @@ static void qemu_rbd_parse_filename(const char *filename, QDict *options,
     qemu_rbd_unescape(found_str);
     qdict_put_str(options, "pool", found_str);
 
-    if (strchr(p, '@')) {
+    if (qemu_rbd_strchr(p, '@')) {
         image_name = qemu_rbd_next_tok(p, '@', &p);
 
         found_str = qemu_rbd_next_tok(p, ':', &p);
@@ -181,7 +191,7 @@ static void qemu_rbd_parse_filename(const char *filename, QDict *options,
         image_name = qemu_rbd_next_tok(p, ':', &p);
     }
     /* Check for namespace in the image_name */
-    if (strchr(image_name, '/')) {
+    if (qemu_rbd_strchr(image_name, '/')) {
         found_str = qemu_rbd_next_tok(image_name, '/', &image_name);
         qemu_rbd_unescape(found_str);
         qdict_put_str(options, "namespace", found_str);
diff --git a/tests/qemu-iotests/231 b/tests/qemu-iotests/231
index 0f66d0ca36..8e6c6447c1 100755
--- a/tests/qemu-iotests/231
+++ b/tests/qemu-iotests/231
@@ -55,6 +55,10 @@ _filter_conf()
 $QEMU_IMG info "json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=${BOGUS_CONF}'}" 2>&1 | _filter_conf
 $QEMU_IMG info "json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'${BOGUS_CONF}'}" 2>&1 | _filter_conf
 
+# Regression test: the qemu-img invocation is expected to fail, but it should
+# not seg fault the parser.
+$QEMU_IMG create "rbd:rbd/aa\/bb:conf=${BOGUS_CONF}" 1M 2>&1 | _filter_conf
+
 # success, all done
 echo "*** done"
 rm -f $seq.full
diff --git a/tests/qemu-iotests/231.out b/tests/qemu-iotests/231.out
index 747dd221bb..a785a6e859 100644
--- a/tests/qemu-iotests/231.out
+++ b/tests/qemu-iotests/231.out
@@ -4,4 +4,7 @@ unable to get monitor info from DNS SRV with service name: ceph-mon
 qemu-img: Could not open 'json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=BOGUS_CONF'}': error connecting: No such file or directory
 unable to get monitor info from DNS SRV with service name: ceph-mon
 qemu-img: Could not open 'json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'BOGUS_CONF'}': error connecting: No such file or directory
+Formatting 'rbd:rbd/aa\/bb:conf=BOGUS_CONF', fmt=raw size=1048576
+unable to get monitor info from DNS SRV with service name: ceph-mon
+qemu-img: rbd:rbd/aa\/bb:conf=BOGUS_CONF: error connecting: No such file or directory
 *** done
-- 
2.30.2



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

* Re: [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper
  2021-04-21 21:23 ` [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper Connor Kuehl
@ 2021-04-22  7:12   ` Stefano Garzarella
  0 siblings, 0 replies; 5+ messages in thread
From: Stefano Garzarella @ 2021-04-22  7:12 UTC (permalink / raw)
  To: Connor Kuehl; +Cc: kwolf, qemu-devel, qemu-block, mreitz

On Wed, Apr 21, 2021 at 04:23:43PM -0500, Connor Kuehl wrote:
>Sometimes the parser needs to further split a token it has collected
>from the token input stream. Right now, it does a cursory check to see
>if the relevant characters appear in the token to determine if it should
>break it down further.
>
>However, qemu_rbd_next_tok() will escape characters as it removes tokens
>from the token stream and plain strchr() won't. This can make the
>initial strchr() check slightly misleading since it implies
>qemu_rbd_next_tok() will find the token and split on it, except the
>reality is that qemu_rbd_next_tok() will pass over it if it is escaped.
>
>Use a custom strchr to avoid mixing escaped and unescaped string
>operations. Furthermore, this code is identical to how
>qemu_rbd_next_tok() seeks its next token, so incorporate this custom
>strchr into the body of that function to reduce duplication.
>
>Reported-by: Han Han <hhan@redhat.com>
>Fixes: https://bugzilla.redhat.com/1873913
>Signed-off-by: Connor Kuehl <ckuehl@redhat.com>
>---
>v3 -> v4:
>  * Replace qemu_rbd_next_tok() seek loop with qemu_rbd_strchr() since
>    they're identical
>
> block/rbd.c                | 32 +++++++++++++++++++++-----------
> tests/qemu-iotests/231     |  4 ++++
> tests/qemu-iotests/231.out |  3 +++
> 3 files changed, 28 insertions(+), 11 deletions(-)

Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>



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

* Re: [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename
  2021-04-21 21:23 [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Connor Kuehl
  2021-04-21 21:23 ` [PATCH v4 1/2] iotests/231: Update expected deprecation message Connor Kuehl
  2021-04-21 21:23 ` [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper Connor Kuehl
@ 2021-04-22 12:32 ` Max Reitz
  2 siblings, 0 replies; 5+ messages in thread
From: Max Reitz @ 2021-04-22 12:32 UTC (permalink / raw)
  To: Connor Kuehl, qemu-block; +Cc: kwolf, qemu-devel, sgarzare

On 21.04.21 23:23, Connor Kuehl wrote:
> Connor Kuehl (2):
>    iotests/231: Update expected deprecation message
>    block/rbd: Add an escape-aware strchr helper
> 
>   block/rbd.c                | 32 +++++++++++++++++++++-----------
>   tests/qemu-iotests/231     |  4 ++++
>   tests/qemu-iotests/231.out |  7 ++++---
>   3 files changed, 29 insertions(+), 14 deletions(-)

Thanks, applied to my block-next branch (for 6.1):

https://git.xanclic.moe/XanClic/qemu/commits/branch/block-next

Max



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

end of thread, other threads:[~2021-04-22 12:37 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-21 21:23 [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Connor Kuehl
2021-04-21 21:23 ` [PATCH v4 1/2] iotests/231: Update expected deprecation message Connor Kuehl
2021-04-21 21:23 ` [PATCH v4 2/2] block/rbd: Add an escape-aware strchr helper Connor Kuehl
2021-04-22  7:12   ` Stefano Garzarella
2021-04-22 12:32 ` [PATCH v4 0/2] Fix segfault in qemu_rbd_parse_filename Max Reitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).