1 | The following changes since commit 19b599f7664b2ebfd0f405fb79c14dd241557452: | 1 | The following changes since commit 871af84dd599fab68c8ed414d9ecbdb2bcfc5801: |
---|---|---|---|
2 | 2 | ||
3 | Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2018-08-27-v2' into staging (2018-08-27 16:44:20 +0100) | 3 | Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2025-01-29 09:51:03 -0500) |
4 | 4 | ||
5 | are available in the Git repository at: | 5 | are available in the Git repository at: |
6 | 6 | ||
7 | git://github.com/codyprime/qemu-kvm-jtc.git tags/block-pull-request | 7 | https://gitlab.com/stefanha/qemu.git tags/block-pull-request |
8 | 8 | ||
9 | for you to fetch changes up to 8af2eb7b43a1b694fd6d1d090025027d6b72caac: | 9 | for you to fetch changes up to 58607752d173438994d28dea7e2c2587726663e6: |
10 | 10 | ||
11 | block/rbd: add deprecation documentation for filename keyvalue pairs (2018-09-12 08:51:45 -0400) | 11 | parallels: fix ext_off assertion failure due to overflow (2025-01-30 15:22:28 -0500) |
12 | 12 | ||
13 | ---------------------------------------------------------------- | 13 | ---------------------------------------------------------------- |
14 | Block patches for RBD | 14 | Pull request |
15 | |||
15 | ---------------------------------------------------------------- | 16 | ---------------------------------------------------------------- |
16 | 17 | ||
17 | Jeff Cody (4): | 18 | Denis Rastyogin (1): |
18 | block/rbd: pull out qemu_rbd_convert_options | 19 | parallels: fix ext_off assertion failure due to overflow |
19 | block/rbd: Attempt to parse legacy filenames | ||
20 | block/rbd: add iotest for rbd legacy keyvalue filename parsing | ||
21 | block/rbd: add deprecation documentation for filename keyvalue pairs | ||
22 | 20 | ||
23 | block/rbd.c | 89 ++++++++++++++++++++++++++++++++------ | 21 | block/parallels.c | 4 ++++ |
24 | qemu-deprecated.texi | 15 +++++++ | 22 | 1 file changed, 4 insertions(+) |
25 | tests/qemu-iotests/231 | 62 ++++++++++++++++++++++++++ | ||
26 | tests/qemu-iotests/231.out | 9 ++++ | ||
27 | tests/qemu-iotests/group | 1 + | ||
28 | 5 files changed, 162 insertions(+), 14 deletions(-) | ||
29 | create mode 100755 tests/qemu-iotests/231 | ||
30 | create mode 100644 tests/qemu-iotests/231.out | ||
31 | 23 | ||
32 | -- | 24 | -- |
33 | 2.17.1 | 25 | 2.48.1 |
34 | |||
35 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Code movement to pull the conversion from Qdict to BlockdevOptionsRbd | ||
2 | into a helper function. | ||
3 | 1 | ||
4 | Reviewed-by: Eric Blake <eblake@redhat.com> | ||
5 | Reviewed-by: John Snow <jsnow@redhat.com> | ||
6 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
7 | Message-id: 5b49a980f2cde6610ab1df41bb0277d00b5db893.1536704901.git.jcody@redhat.com | ||
8 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
9 | --- | ||
10 | block/rbd.c | 36 ++++++++++++++++++++++++------------ | ||
11 | 1 file changed, 24 insertions(+), 12 deletions(-) | ||
12 | |||
13 | diff --git a/block/rbd.c b/block/rbd.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/block/rbd.c | ||
16 | +++ b/block/rbd.c | ||
17 | @@ -XXX,XX +XXX,XX @@ failed_opts: | ||
18 | return r; | ||
19 | } | ||
20 | |||
21 | +static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts, | ||
22 | + Error **errp) | ||
23 | +{ | ||
24 | + Visitor *v; | ||
25 | + Error *local_err = NULL; | ||
26 | + | ||
27 | + /* Convert the remaining options into a QAPI object */ | ||
28 | + v = qobject_input_visitor_new_flat_confused(options, errp); | ||
29 | + if (!v) { | ||
30 | + return -EINVAL; | ||
31 | + } | ||
32 | + | ||
33 | + visit_type_BlockdevOptionsRbd(v, NULL, opts, &local_err); | ||
34 | + visit_free(v); | ||
35 | + | ||
36 | + if (local_err) { | ||
37 | + error_propagate(errp, local_err); | ||
38 | + return -EINVAL; | ||
39 | + } | ||
40 | + | ||
41 | + return 0; | ||
42 | +} | ||
43 | + | ||
44 | static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, | ||
45 | Error **errp) | ||
46 | { | ||
47 | BDRVRBDState *s = bs->opaque; | ||
48 | BlockdevOptionsRbd *opts = NULL; | ||
49 | - Visitor *v; | ||
50 | const QDictEntry *e; | ||
51 | Error *local_err = NULL; | ||
52 | char *keypairs, *secretid; | ||
53 | @@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, | ||
54 | qdict_del(options, "password-secret"); | ||
55 | } | ||
56 | |||
57 | - /* Convert the remaining options into a QAPI object */ | ||
58 | - v = qobject_input_visitor_new_flat_confused(options, errp); | ||
59 | - if (!v) { | ||
60 | - r = -EINVAL; | ||
61 | - goto out; | ||
62 | - } | ||
63 | - | ||
64 | - visit_type_BlockdevOptionsRbd(v, NULL, &opts, &local_err); | ||
65 | - visit_free(v); | ||
66 | - | ||
67 | + r = qemu_rbd_convert_options(options, &opts, &local_err); | ||
68 | if (local_err) { | ||
69 | error_propagate(errp, local_err); | ||
70 | - r = -EINVAL; | ||
71 | goto out; | ||
72 | } | ||
73 | |||
74 | -- | ||
75 | 2.17.1 | ||
76 | |||
77 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | When we converted rbd to get rid of the older key/value-centric | ||
2 | encoding format, we broke compatibility with image files with backing | ||
3 | file strings encoded in the old format. | ||
4 | 1 | ||
5 | This leaves a bit of an ugly conundrum, and a hacky solution. | ||
6 | |||
7 | If the initial attempt to parse the "proper" options fails, it assumes | ||
8 | that we may have an older key/value encoded filename. Fall back to | ||
9 | attempting to parse the filename, and extract the required options from | ||
10 | it. If that fails, pass along the original error message. | ||
11 | |||
12 | We do not support mixed modern usage alongside legacy keyvalue pair | ||
13 | usage. | ||
14 | |||
15 | A deprecation warning has been added, although care should be taken | ||
16 | when actually deprecating since the impact is not limited to | ||
17 | commandline or qapi usage, but also opening existing images. | ||
18 | |||
19 | Reviewed-by: Eric Blake <eblake@redhat.com> | ||
20 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
21 | Message-id: 15b332e5432ad069441f7275a46080f465d789a0.1536704901.git.jcody@redhat.com | ||
22 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
23 | --- | ||
24 | block/rbd.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- | ||
25 | 1 file changed, 51 insertions(+), 2 deletions(-) | ||
26 | |||
27 | diff --git a/block/rbd.c b/block/rbd.c | ||
28 | index XXXXXXX..XXXXXXX 100644 | ||
29 | --- a/block/rbd.c | ||
30 | +++ b/block/rbd.c | ||
31 | @@ -XXX,XX +XXX,XX @@ static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts, | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | +static int qemu_rbd_attempt_legacy_options(QDict *options, | ||
36 | + BlockdevOptionsRbd **opts, | ||
37 | + char **keypairs) | ||
38 | +{ | ||
39 | + char *filename; | ||
40 | + int r; | ||
41 | + | ||
42 | + filename = g_strdup(qdict_get_try_str(options, "filename")); | ||
43 | + if (!filename) { | ||
44 | + return -EINVAL; | ||
45 | + } | ||
46 | + qdict_del(options, "filename"); | ||
47 | + | ||
48 | + qemu_rbd_parse_filename(filename, options, NULL); | ||
49 | + | ||
50 | + /* keypairs freed by caller */ | ||
51 | + *keypairs = g_strdup(qdict_get_try_str(options, "=keyvalue-pairs")); | ||
52 | + if (*keypairs) { | ||
53 | + qdict_del(options, "=keyvalue-pairs"); | ||
54 | + } | ||
55 | + | ||
56 | + r = qemu_rbd_convert_options(options, opts, NULL); | ||
57 | + | ||
58 | + g_free(filename); | ||
59 | + return r; | ||
60 | +} | ||
61 | + | ||
62 | static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, | ||
63 | Error **errp) | ||
64 | { | ||
65 | @@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags, | ||
66 | |||
67 | r = qemu_rbd_convert_options(options, &opts, &local_err); | ||
68 | if (local_err) { | ||
69 | - error_propagate(errp, local_err); | ||
70 | - goto out; | ||
71 | + /* If keypairs are present, that means some options are present in | ||
72 | + * the modern option format. Don't attempt to parse legacy option | ||
73 | + * formats, as we won't support mixed usage. */ | ||
74 | + if (keypairs) { | ||
75 | + error_propagate(errp, local_err); | ||
76 | + goto out; | ||
77 | + } | ||
78 | + | ||
79 | + /* If the initial attempt to convert and process the options failed, | ||
80 | + * we may be attempting to open an image file that has the rbd options | ||
81 | + * specified in the older format consisting of all key/value pairs | ||
82 | + * encoded in the filename. Go ahead and attempt to parse the | ||
83 | + * filename, and see if we can pull out the required options. */ | ||
84 | + r = qemu_rbd_attempt_legacy_options(options, &opts, &keypairs); | ||
85 | + if (r < 0) { | ||
86 | + error_propagate(errp, local_err); | ||
87 | + goto out; | ||
88 | + } | ||
89 | + /* Take care whenever deciding to actually deprecate; once this ability | ||
90 | + * is removed, we will not be able to open any images with legacy-styled | ||
91 | + * backing image strings. */ | ||
92 | + error_report("RBD options encoded in the filename as keyvalue pairs " | ||
93 | + "is deprecated. Future versions may cease to parse " | ||
94 | + "these options in the future."); | ||
95 | } | ||
96 | |||
97 | /* Remove the processed options from the QDict (the visitor processes | ||
98 | -- | ||
99 | 2.17.1 | ||
100 | |||
101 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This is a small test that will check for the ability to parse | ||
2 | both legacy and modern options for rbd. | ||
3 | 1 | ||
4 | The way the test is set up is for failure to occur, but without | ||
5 | having to wait to timeout on a non-existent rbd server. The error | ||
6 | messages in the success path show that the arguments were parsed. | ||
7 | |||
8 | The failure behavior prior to the patch series that has this test, is | ||
9 | qemu-img complaining about mandatory options (e.g. 'pool') not being | ||
10 | provided. | ||
11 | |||
12 | Reviewed-by: Eric Blake <eblake@redhat.com> | ||
13 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
14 | Message-id: f830580e339b974a83ed4870d11adcdc17f49a47.1536704901.git.jcody@redhat.com | ||
15 | Signed-off-by: Jeff Cody <jcody@redhat.com> | ||
16 | --- | ||
17 | tests/qemu-iotests/231 | 62 ++++++++++++++++++++++++++++++++++++++ | ||
18 | tests/qemu-iotests/231.out | 9 ++++++ | ||
19 | tests/qemu-iotests/group | 1 + | ||
20 | 3 files changed, 72 insertions(+) | ||
21 | create mode 100755 tests/qemu-iotests/231 | ||
22 | create mode 100644 tests/qemu-iotests/231.out | ||
23 | |||
24 | diff --git a/tests/qemu-iotests/231 b/tests/qemu-iotests/231 | ||
25 | new file mode 100755 | ||
26 | index XXXXXXX..XXXXXXX | ||
27 | --- /dev/null | ||
28 | +++ b/tests/qemu-iotests/231 | ||
29 | @@ -XXX,XX +XXX,XX @@ | ||
30 | +#!/bin/bash | ||
31 | +# | ||
32 | +# Test legacy and modern option parsing for rbd/ceph. This will not | ||
33 | +# actually connect to a ceph server, but rather looks for the appropriate | ||
34 | +# error message that indicates we parsed the options correctly. | ||
35 | +# | ||
36 | +# Copyright (C) 2018 Red Hat, Inc. | ||
37 | +# | ||
38 | +# This program is free software; you can redistribute it and/or modify | ||
39 | +# it under the terms of the GNU General Public License as published by | ||
40 | +# the Free Software Foundation; either version 2 of the License, or | ||
41 | +# (at your option) any later version. | ||
42 | +# | ||
43 | +# This program is distributed in the hope that it will be useful, | ||
44 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
45 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
46 | +# GNU General Public License for more details. | ||
47 | +# | ||
48 | +# You should have received a copy of the GNU General Public License | ||
49 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
50 | +# | ||
51 | + | ||
52 | +# creator | ||
53 | +owner=jcody@redhat.com | ||
54 | + | ||
55 | +seq=`basename $0` | ||
56 | +echo "QA output created by $seq" | ||
57 | + | ||
58 | +here=`pwd` | ||
59 | +status=1 # failure is the default! | ||
60 | + | ||
61 | +_cleanup() | ||
62 | +{ | ||
63 | + rm "${BOGUS_CONF}" | ||
64 | +} | ||
65 | +trap "_cleanup; exit \$status" 0 1 2 3 15 | ||
66 | + | ||
67 | +# get standard environment, filters and checks | ||
68 | +. ./common.rc | ||
69 | +. ./common.filter | ||
70 | + | ||
71 | +_supported_fmt generic | ||
72 | +_supported_proto rbd | ||
73 | +_supported_os Linux | ||
74 | + | ||
75 | +BOGUS_CONF=${TEST_DIR}/ceph-$$.conf | ||
76 | +touch "${BOGUS_CONF}" | ||
77 | + | ||
78 | +_filter_conf() | ||
79 | +{ | ||
80 | + sed -e "s#$BOGUS_CONF#BOGUS_CONF#g" | ||
81 | +} | ||
82 | + | ||
83 | +# We expect this to fail, with no monitor ip provided and a null conf file. Just want it | ||
84 | +# to fail in the right way. | ||
85 | +$QEMU_IMG info "json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=${BOGUS_CONF}'}" 2>&1 | _filter_conf | ||
86 | +$QEMU_IMG info "json:{'file.driver':'rbd','file.pool':'rbd','file.image':'bogus','file.conf':'${BOGUS_CONF}'}" 2>&1 | _filter_conf | ||
87 | + | ||
88 | +# success, all done | ||
89 | +echo "*** done" | ||
90 | +rm -f $seq.full | ||
91 | +status=0 | ||
92 | diff --git a/tests/qemu-iotests/231.out b/tests/qemu-iotests/231.out | ||
93 | new file mode 100644 | ||
94 | index XXXXXXX..XXXXXXX | ||
95 | --- /dev/null | ||
96 | +++ b/tests/qemu-iotests/231.out | ||
97 | @@ -XXX,XX +XXX,XX @@ | ||
98 | +QA output created by 231 | ||
99 | +qemu-img: RBD options encoded in the filename as keyvalue pairs is deprecated. Future versions may cease to parse these options in the future. | ||
100 | +unable to get monitor info from DNS SRV with service name: ceph-mon | ||
101 | +no monitors specified to connect to. | ||
102 | +qemu-img: Could not open 'json:{'file.driver':'rbd','file.filename':'rbd:rbd/bogus:conf=BOGUS_CONF'}': error connecting: No such file or directory | ||
103 | +unable to get monitor info from DNS SRV with service name: ceph-mon | ||
104 | +no monitors specified to connect to. | ||
105 | +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 | ||
106 | +*** done | ||
107 | diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group | ||
108 | index XXXXXXX..XXXXXXX 100644 | ||
109 | --- a/tests/qemu-iotests/group | ||
110 | +++ b/tests/qemu-iotests/group | ||
111 | @@ -XXX,XX +XXX,XX @@ | ||
112 | 226 auto quick | ||
113 | 227 auto quick | ||
114 | 229 auto quick | ||
115 | +231 auto quick | ||
116 | -- | ||
117 | 2.17.1 | ||
118 | |||
119 | diff view generated by jsdifflib |
1 | Signed-off-by: Jeff Cody <jcody@redhat.com> | 1 | From: Denis Rastyogin <gerben@altlinux.org> |
---|---|---|---|
2 | Message-id: 647f5b5ab7efd8bf567a504c832b1d2d6f719b23.1536704901.git.jcody@redhat.com | 2 | |
3 | Signed-off-by: Jeff Cody <jcody@redhat.com> | 3 | This error was discovered by fuzzing qemu-img. |
4 | |||
5 | When ph.ext_off has a sufficiently large value, the operation | ||
6 | le64_to_cpu(ph.ext_off) << BDRV_SECTOR_BITS in | ||
7 | parallels_read_format_extension() can cause an overflow in int64_t. | ||
8 | This overflow triggers the assert(ext_off > 0) | ||
9 | check in block/parallels-ext.c: parallels_read_format_extension(), | ||
10 | leading to a crash. | ||
11 | |||
12 | This commit adds a check to prevent overflow when shifting ph.ext_off | ||
13 | by BDRV_SECTOR_BITS, ensuring that the value remains within a valid range. | ||
14 | |||
15 | Reported-by: Leonid Reviakin <L.reviakin@fobos-nt.ru> | ||
16 | Signed-off-by: Denis Rastyogin <gerben@altlinux.org> | ||
17 | Reviewed-by: Denis V. Lunev <den@openvz.org> | ||
18 | Message-ID: <20241212104212.513947-2-gerben@altlinux.org> | ||
19 | Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> | ||
4 | --- | 20 | --- |
5 | qemu-deprecated.texi | 15 +++++++++++++++ | 21 | block/parallels.c | 4 ++++ |
6 | 1 file changed, 15 insertions(+) | 22 | 1 file changed, 4 insertions(+) |
7 | 23 | ||
8 | diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi | 24 | diff --git a/block/parallels.c b/block/parallels.c |
9 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
10 | --- a/qemu-deprecated.texi | 26 | --- a/block/parallels.c |
11 | +++ b/qemu-deprecated.texi | 27 | +++ b/block/parallels.c |
12 | @@ -XXX,XX +XXX,XX @@ used instead. | 28 | @@ -XXX,XX +XXX,XX @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags, |
13 | In order to prevent QEMU from automatically opening an image's backing | 29 | error_setg(errp, "Catalog too large"); |
14 | chain, use ``"backing": null'' instead. | 30 | return -EFBIG; |
15 | 31 | } | |
16 | +@subsubsection rbd keyvalue pair encoded filenames: "" (since 3.1.0) | 32 | + if (le64_to_cpu(ph.ext_off) >= (INT64_MAX >> BDRV_SECTOR_BITS)) { |
17 | + | 33 | + error_setg(errp, "Invalid image: Too big offset"); |
18 | +Options for ``rbd'' should be specified according to its runtime options, | 34 | + return -EFBIG; |
19 | +like other block drivers. Legacy parsing of keyvalue pair encoded | 35 | + } |
20 | +filenames is useful to open images with the old format for backing files; | 36 | |
21 | +These image files should be updated to use the current format. | 37 | size = bat_entry_off(s->bat_size); |
22 | + | 38 | s->header_size = ROUND_UP(size, bdrv_opt_mem_align(bs->file->bs)); |
23 | +Example of legacy encoding: | ||
24 | + | ||
25 | +@code{json:@{"file.driver":"rbd", "file.filename":"rbd:rbd/name"@}} | ||
26 | + | ||
27 | +The above, converted to the current supported format: | ||
28 | + | ||
29 | +@code{json:@{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"@}} | ||
30 | + | ||
31 | @subsection vio-spapr-device device options | ||
32 | |||
33 | @subsubsection "irq": "" (since 3.0.0) | ||
34 | -- | 39 | -- |
35 | 2.17.1 | 40 | 2.48.1 |
36 | |||
37 | diff view generated by jsdifflib |