* [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
@ 2014-03-12 17:00 Markus Armbruster
2014-03-12 17:19 ` Eric Blake
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Markus Armbruster @ 2014-03-12 17:00 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf, stefanha
Opening an encrypted image takes an additional step: setting the key.
Between open and the key set, the image must not be used.
We have some protection against accidental use in place: you can't
unpause a guest while we're missing keys. You can, however, hot-plug
block devices lacking keys into a running guest just fine, or insert
media lacking keys. In the latter case, notifying the guest of the
insert is delayed until the key is set, which may suffice to protect
at least some guests in common usage.
This patch makes the protection apply in more cases, in a rather
heavy-handed way: it doesn't let you open encrypted images unless
we're in a paused state.
It doesn't extend the protection to users other than the guest (block
jobs?). Use of runstate_check() from block.c is disgusting. Best I
can do right now.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
block.c | 8 +++++++-
stubs/Makefile.objs | 1 +
stubs/runstate-check.c | 6 ++++++
3 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 stubs/runstate-check.c
diff --git a/block.c b/block.c
index f1ef4b0..7604881 100644
--- a/block.c
+++ b/block.c
@@ -1388,12 +1388,18 @@ done:
ret = -EINVAL;
goto close_and_fail;
}
- QDECREF(options);
if (!bdrv_key_required(bs)) {
bdrv_dev_change_media_cb(bs, true);
+ } else if (!runstate_check(RUN_STATE_PRELAUNCH)
+ && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
+ error_setg(errp,
+ "Guest must be stopped for opening of encrypted image");
+ ret = -EBUSY;
+ goto close_and_fail;
}
+ QDECREF(options);
*pbs = bs;
return 0;
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index df3aa7a..09e7790 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -19,6 +19,7 @@ stub-obj-y += mon-protocol-event.o
stub-obj-y += mon-set-error.o
stub-obj-y += pci-drive-hot-add.o
stub-obj-y += reset.o
+stub-obj-y += runstate-check.o
stub-obj-y += set-fd-handler.o
stub-obj-y += slirp.o
stub-obj-y += sysbus.o
diff --git a/stubs/runstate-check.c b/stubs/runstate-check.c
new file mode 100644
index 0000000..bd2e375
--- /dev/null
+++ b/stubs/runstate-check.c
@@ -0,0 +1,6 @@
+#include "sysemu/sysemu.h"
+
+bool runstate_check(RunState state)
+{
+ return state == RUN_STATE_PRELAUNCH;
+}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-12 17:00 [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused Markus Armbruster
@ 2014-03-12 17:19 ` Eric Blake
2014-03-13 9:26 ` Fam Zheng
2014-03-13 10:43 ` Paolo Bonzini
2 siblings, 0 replies; 14+ messages in thread
From: Eric Blake @ 2014-03-12 17:19 UTC (permalink / raw)
To: Markus Armbruster, qemu-devel; +Cc: kwolf, stefanha
[-- Attachment #1: Type: text/plain, Size: 1426 bytes --]
On 03/12/2014 11:00 AM, Markus Armbruster wrote:
> Opening an encrypted image takes an additional step: setting the key.
> Between open and the key set, the image must not be used.
>
> We have some protection against accidental use in place: you can't
> unpause a guest while we're missing keys. You can, however, hot-plug
> block devices lacking keys into a running guest just fine, or insert
> media lacking keys. In the latter case, notifying the guest of the
> insert is delayed until the key is set, which may suffice to protect
> at least some guests in common usage.
>
> This patch makes the protection apply in more cases, in a rather
> heavy-handed way: it doesn't let you open encrypted images unless
> we're in a paused state.
>
> It doesn't extend the protection to users other than the guest (block
> jobs?). Use of runstate_check() from block.c is disgusting. Best I
> can do right now.
Better than what we had before, and worth having in 2.0
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
> block.c | 8 +++++++-
> stubs/Makefile.objs | 1 +
> stubs/runstate-check.c | 6 ++++++
> 3 files changed, 14 insertions(+), 1 deletion(-)
> create mode 100644 stubs/runstate-check.c
>
Reviewed-by: Eric Blake <eblake@redhat.com>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-12 17:00 [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused Markus Armbruster
2014-03-12 17:19 ` Eric Blake
@ 2014-03-13 9:26 ` Fam Zheng
2014-03-13 13:25 ` Markus Armbruster
2014-03-13 10:43 ` Paolo Bonzini
2 siblings, 1 reply; 14+ messages in thread
From: Fam Zheng @ 2014-03-13 9:26 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha
On Wed, 03/12 18:00, Markus Armbruster wrote:
> Opening an encrypted image takes an additional step: setting the key.
> Between open and the key set, the image must not be used.
>
> We have some protection against accidental use in place: you can't
> unpause a guest while we're missing keys. You can, however, hot-plug
> block devices lacking keys into a running guest just fine, or insert
> media lacking keys. In the latter case, notifying the guest of the
> insert is delayed until the key is set, which may suffice to protect
> at least some guests in common usage.
>
> This patch makes the protection apply in more cases, in a rather
> heavy-handed way: it doesn't let you open encrypted images unless
> we're in a paused state.
>
> It doesn't extend the protection to users other than the guest (block
> jobs?). Use of runstate_check() from block.c is disgusting. Best I
> can do right now.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
> block.c | 8 +++++++-
> stubs/Makefile.objs | 1 +
> stubs/runstate-check.c | 6 ++++++
> 3 files changed, 14 insertions(+), 1 deletion(-)
> create mode 100644 stubs/runstate-check.c
>
> diff --git a/block.c b/block.c
> index f1ef4b0..7604881 100644
> --- a/block.c
> +++ b/block.c
> @@ -1388,12 +1388,18 @@ done:
> ret = -EINVAL;
> goto close_and_fail;
> }
> - QDECREF(options);
>
> if (!bdrv_key_required(bs)) {
> bdrv_dev_change_media_cb(bs, true);
> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
> + error_setg(errp,
> + "Guest must be stopped for opening of encrypted image");
Changing error message here breaks qemu-iotests 087.
Thanks,
Fam
> + ret = -EBUSY;
> + goto close_and_fail;
> }
>
> + QDECREF(options);
> *pbs = bs;
> return 0;
>
> diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
> index df3aa7a..09e7790 100644
> --- a/stubs/Makefile.objs
> +++ b/stubs/Makefile.objs
> @@ -19,6 +19,7 @@ stub-obj-y += mon-protocol-event.o
> stub-obj-y += mon-set-error.o
> stub-obj-y += pci-drive-hot-add.o
> stub-obj-y += reset.o
> +stub-obj-y += runstate-check.o
> stub-obj-y += set-fd-handler.o
> stub-obj-y += slirp.o
> stub-obj-y += sysbus.o
> diff --git a/stubs/runstate-check.c b/stubs/runstate-check.c
> new file mode 100644
> index 0000000..bd2e375
> --- /dev/null
> +++ b/stubs/runstate-check.c
> @@ -0,0 +1,6 @@
> +#include "sysemu/sysemu.h"
> +
> +bool runstate_check(RunState state)
> +{
> + return state == RUN_STATE_PRELAUNCH;
> +}
> --
> 1.8.1.4
>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-12 17:00 [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused Markus Armbruster
2014-03-12 17:19 ` Eric Blake
2014-03-13 9:26 ` Fam Zheng
@ 2014-03-13 10:43 ` Paolo Bonzini
2014-03-13 13:18 ` Markus Armbruster
2014-03-13 13:27 ` Eric Blake
2 siblings, 2 replies; 14+ messages in thread
From: Paolo Bonzini @ 2014-03-13 10:43 UTC (permalink / raw)
To: Markus Armbruster, qemu-devel; +Cc: kwolf, stefanha
Il 12/03/2014 18:00, Markus Armbruster ha scritto:
> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
Why not "if (runstate_is_running())"?
Paolo
> + error_setg(errp,
> + "Guest must be stopped for opening of encrypted image");
> + ret = -EBUSY;
> + goto close_and_fail;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 10:43 ` Paolo Bonzini
@ 2014-03-13 13:18 ` Markus Armbruster
2014-03-13 14:14 ` Paolo Bonzini
2014-03-13 13:27 ` Eric Blake
1 sibling, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2014-03-13 13:18 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kwolf, qemu-devel, stefanha
Paolo Bonzini <pbonzini@redhat.com> writes:
> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>
> Why not "if (runstate_is_running())"?
The predicate actually wanted here is "monitor command 'cont' required
to get the guest running", because 'cont' is where the protection is.
My run state test is a crude approximation.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 9:26 ` Fam Zheng
@ 2014-03-13 13:25 ` Markus Armbruster
2014-03-14 1:13 ` Fam Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2014-03-13 13:25 UTC (permalink / raw)
To: Fam Zheng; +Cc: kwolf, qemu-devel, stefanha
Fam Zheng <famz@redhat.com> writes:
> On Wed, 03/12 18:00, Markus Armbruster wrote:
>> Opening an encrypted image takes an additional step: setting the key.
>> Between open and the key set, the image must not be used.
>>
>> We have some protection against accidental use in place: you can't
>> unpause a guest while we're missing keys. You can, however, hot-plug
>> block devices lacking keys into a running guest just fine, or insert
>> media lacking keys. In the latter case, notifying the guest of the
>> insert is delayed until the key is set, which may suffice to protect
>> at least some guests in common usage.
>>
>> This patch makes the protection apply in more cases, in a rather
>> heavy-handed way: it doesn't let you open encrypted images unless
>> we're in a paused state.
>>
>> It doesn't extend the protection to users other than the guest (block
>> jobs?). Use of runstate_check() from block.c is disgusting. Best I
>> can do right now.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>> block.c | 8 +++++++-
>> stubs/Makefile.objs | 1 +
>> stubs/runstate-check.c | 6 ++++++
>> 3 files changed, 14 insertions(+), 1 deletion(-)
>> create mode 100644 stubs/runstate-check.c
>>
>> diff --git a/block.c b/block.c
>> index f1ef4b0..7604881 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -1388,12 +1388,18 @@ done:
>> ret = -EINVAL;
>> goto close_and_fail;
>> }
>> - QDECREF(options);
>>
>> if (!bdrv_key_required(bs)) {
>> bdrv_dev_change_media_cb(bs, true);
>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>> + error_setg(errp,
>> + "Guest must be stopped for opening of encrypted image");
>
> Changing error message here breaks qemu-iotests 087.
Crap. I'm on vacation until Monday, just checking in to shepherd this
patch...
On *master*, "make check-block" reports
Not run: 016 052 059 064 070 077
Failures: 085 087
Failed 2 of 34 tests
What am I doing wrong?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 10:43 ` Paolo Bonzini
2014-03-13 13:18 ` Markus Armbruster
@ 2014-03-13 13:27 ` Eric Blake
2014-03-13 14:19 ` Paolo Bonzini
1 sibling, 1 reply; 14+ messages in thread
From: Eric Blake @ 2014-03-13 13:27 UTC (permalink / raw)
To: Paolo Bonzini, Markus Armbruster, qemu-devel; +Cc: kwolf, stefanha
[-- Attachment #1: Type: text/plain, Size: 455 bytes --]
On 03/13/2014 04:43 AM, Paolo Bonzini wrote:
> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>
> Why not "if (runstate_is_running())"?
Because that lacks PRELAUNCH, but PRELAUNCH also needs the protection.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 13:18 ` Markus Armbruster
@ 2014-03-13 14:14 ` Paolo Bonzini
2014-03-13 15:00 ` Markus Armbruster
0 siblings, 1 reply; 14+ messages in thread
From: Paolo Bonzini @ 2014-03-13 14:14 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha
Il 13/03/2014 14:18, Markus Armbruster ha scritto:
> Paolo Bonzini <pbonzini@redhat.com> writes:
>
>> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>>
>> Why not "if (runstate_is_running())"?
>
> The predicate actually wanted here is "monitor command 'cont' required
> to get the guest running", because 'cont' is where the protection is.
> My run state test is a crude approximation.
>
Got it. Then you need to add at least a check for
"runstate_check(RUN_STATE_INMIGRATE)", otherwise you break incoming
migration. Actually, I think only SAVE_VM/RESTORE_VM/DEBUG are
problematic, but I understand why you preferred a conservative
test (sufficient condition, not necessary).
You are singling out prelaunch and inmigrate because drive_init
will reset autostart to 0 for an encrypted image, right?
Paolo
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 13:27 ` Eric Blake
@ 2014-03-13 14:19 ` Paolo Bonzini
0 siblings, 0 replies; 14+ messages in thread
From: Paolo Bonzini @ 2014-03-13 14:19 UTC (permalink / raw)
To: Eric Blake, Markus Armbruster, qemu-devel; +Cc: kwolf, stefanha
Il 13/03/2014 14:27, Eric Blake ha scritto:
>>> >> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>>> >> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>> >
>> > Why not "if (runstate_is_running())"?
> Because that lacks PRELAUNCH, but PRELAUNCH also needs the protection.
Nope, PRELAUNCH does *not* need the protection.
if (!runstate_check(PRELAUNCH) && !runstate_check(PAUSED)) error
gives an error if runstate == anything *but*
PRELAUNCH and PAUSED
It's at least DEBUG, SAVE_VM and RESTORE_VM that do need it but are not
included in runstate_is_running.
Paolo
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 14:14 ` Paolo Bonzini
@ 2014-03-13 15:00 ` Markus Armbruster
2014-03-13 15:08 ` Paolo Bonzini
0 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2014-03-13 15:00 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kwolf, qemu-devel, stefanha
Paolo Bonzini <pbonzini@redhat.com> writes:
> Il 13/03/2014 14:18, Markus Armbruster ha scritto:
>> Paolo Bonzini <pbonzini@redhat.com> writes:
>>
>>> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>>>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>>>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>>>
>>> Why not "if (runstate_is_running())"?
>>
>> The predicate actually wanted here is "monitor command 'cont' required
>> to get the guest running", because 'cont' is where the protection is.
>> My run state test is a crude approximation.
>>
>
> Got it. Then you need to add at least a check for
> "runstate_check(RUN_STATE_INMIGRATE)", otherwise you break incoming
> migration.
You're right: main() goes from RUN_STATE_PRELAUNCH to
RUN_STATE_INMIGRATE right when it sees -incoming.
> Actually, I think only SAVE_VM/RESTORE_VM/DEBUG are
> problematic, but I understand why you preferred a conservative
> test (sufficient condition, not necessary).
Exactly.
> You are singling out prelaunch and inmigrate because drive_init
> will reset autostart to 0 for an encrypted image, right?
Yes.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 15:00 ` Markus Armbruster
@ 2014-03-13 15:08 ` Paolo Bonzini
2014-03-14 8:15 ` Markus Armbruster
0 siblings, 1 reply; 14+ messages in thread
From: Paolo Bonzini @ 2014-03-13 15:08 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha
Il 13/03/2014 16:00, Markus Armbruster ha scritto:
> Paolo Bonzini <pbonzini@redhat.com> writes:
>
>> Il 13/03/2014 14:18, Markus Armbruster ha scritto:
>>> Paolo Bonzini <pbonzini@redhat.com> writes:
>>>
>>>> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>>>>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>>>>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>>>>
>>>> Why not "if (runstate_is_running())"?
>>>
>>> The predicate actually wanted here is "monitor command 'cont' required
>>> to get the guest running", because 'cont' is where the protection is.
>>> My run state test is a crude approximation.
>>>
>>
>> Got it. Then you need to add at least a check for
>> "runstate_check(RUN_STATE_INMIGRATE)", otherwise you break incoming
>> migration.
>
> You're right: main() goes from RUN_STATE_PRELAUNCH to
> RUN_STATE_INMIGRATE right when it sees -incoming.
>
>> Actually, I think only SAVE_VM/RESTORE_VM/DEBUG are
>> problematic, but I understand why you preferred a conservative
>> test (sufficient condition, not necessary).
>
> Exactly.
>
>> You are singling out prelaunch and inmigrate because drive_init
>> will reset autostart to 0 for an encrypted image, right?
>
> Yes.
Then with the check modified,
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 13:25 ` Markus Armbruster
@ 2014-03-14 1:13 ` Fam Zheng
2014-03-14 8:16 ` Markus Armbruster
0 siblings, 1 reply; 14+ messages in thread
From: Fam Zheng @ 2014-03-14 1:13 UTC (permalink / raw)
To: Markus Armbruster; +Cc: kwolf, qemu-devel, stefanha
On Thu, 03/13 14:25, Markus Armbruster wrote:
> Fam Zheng <famz@redhat.com> writes:
>
> > On Wed, 03/12 18:00, Markus Armbruster wrote:
> >> Opening an encrypted image takes an additional step: setting the key.
> >> Between open and the key set, the image must not be used.
> >>
> >> We have some protection against accidental use in place: you can't
> >> unpause a guest while we're missing keys. You can, however, hot-plug
> >> block devices lacking keys into a running guest just fine, or insert
> >> media lacking keys. In the latter case, notifying the guest of the
> >> insert is delayed until the key is set, which may suffice to protect
> >> at least some guests in common usage.
> >>
> >> This patch makes the protection apply in more cases, in a rather
> >> heavy-handed way: it doesn't let you open encrypted images unless
> >> we're in a paused state.
> >>
> >> It doesn't extend the protection to users other than the guest (block
> >> jobs?). Use of runstate_check() from block.c is disgusting. Best I
> >> can do right now.
> >>
> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> ---
> >> block.c | 8 +++++++-
> >> stubs/Makefile.objs | 1 +
> >> stubs/runstate-check.c | 6 ++++++
> >> 3 files changed, 14 insertions(+), 1 deletion(-)
> >> create mode 100644 stubs/runstate-check.c
> >>
> >> diff --git a/block.c b/block.c
> >> index f1ef4b0..7604881 100644
> >> --- a/block.c
> >> +++ b/block.c
> >> @@ -1388,12 +1388,18 @@ done:
> >> ret = -EINVAL;
> >> goto close_and_fail;
> >> }
> >> - QDECREF(options);
> >>
> >> if (!bdrv_key_required(bs)) {
> >> bdrv_dev_change_media_cb(bs, true);
> >> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
> >> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
> >> + error_setg(errp,
> >> + "Guest must be stopped for opening of encrypted image");
> >
> > Changing error message here breaks qemu-iotests 087.
>
> Crap. I'm on vacation until Monday, just checking in to shepherd this
> patch...
>
> On *master*, "make check-block" reports
>
> Not run: 016 052 059 064 070 077
> Failures: 085 087
> Failed 2 of 34 tests
>
I didn't run it from "make check-block" (Stefan sent a patch to remove 085 and
087 from check-block.
Running command: TEST_DIR=/tmp/qemu-iotests QEMU_PROG=../../x86_64-softmmu/qemu-system-x86_64 QEMU_IMG_PROG=../../qemu-img QEMU_IO_PROG=../../qemu-io QEMU_NBD_PROG=../../qemu-nbd ./check -qcow2 -o "" 087
QEMU -- ../../x86_64-softmmu/qemu-system-x86_64
QEMU_IMG -- ../../qemu-img
QEMU_IO -- ../../qemu-io
QEMU_NBD -- ../../qemu-nbd
IMGFMT -- qcow2 (compat=1.1)
IMGPROTO -- file
PLATFORM -- Linux/x86_64 T430 3.13.6-1-ARCH
SOCKET_SCM_HELPER --
087 0s ... - output mismatch (see 087.out.bad)
--- 087.out 2014-03-12 09:28:04.167060760 +0800
+++ 087.out.bad 2014-03-14 09:11:59.770326144 +0800
@@ -31,7 +31,7 @@
Testing:
QMP_VERSION
{"return": {}}
-{"error": {"class": "GenericError", "desc": "blockdev-add doesn't support encrypted devices"}}
+{"error": {"class": "GenericError", "desc": "could not open disk image disk: Guest must be stopped for opening of encrypted image"}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
Failures: 087
Failed 1 of 1 tests
Thanks,
Fam
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-13 15:08 ` Paolo Bonzini
@ 2014-03-14 8:15 ` Markus Armbruster
0 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2014-03-14 8:15 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kwolf, qemu-devel, stefanha
Paolo Bonzini <pbonzini@redhat.com> writes:
> Il 13/03/2014 16:00, Markus Armbruster ha scritto:
>> Paolo Bonzini <pbonzini@redhat.com> writes:
>>
>>> Il 13/03/2014 14:18, Markus Armbruster ha scritto:
>>>> Paolo Bonzini <pbonzini@redhat.com> writes:
>>>>
>>>>> Il 12/03/2014 18:00, Markus Armbruster ha scritto:
>>>>>> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>>>>>> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>>>>>
>>>>> Why not "if (runstate_is_running())"?
>>>>
>>>> The predicate actually wanted here is "monitor command 'cont' required
>>>> to get the guest running", because 'cont' is where the protection is.
>>>> My run state test is a crude approximation.
>>>>
>>>
>>> Got it. Then you need to add at least a check for
>>> "runstate_check(RUN_STATE_INMIGRATE)", otherwise you break incoming
>>> migration.
>>
>> You're right: main() goes from RUN_STATE_PRELAUNCH to
>> RUN_STATE_INMIGRATE right when it sees -incoming.
>>
>>> Actually, I think only SAVE_VM/RESTORE_VM/DEBUG are
>>> problematic, but I understand why you preferred a conservative
>>> test (sufficient condition, not necessary).
>>
>> Exactly.
>>
>>> You are singling out prelaunch and inmigrate because drive_init
>>> will reset autostart to 0 for an encrypted image, right?
>>
>> Yes.
>
> Then with the check modified,
>
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Will do. I'm refraining from adding your R-by, because I need to update
tests, too. Thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused
2014-03-14 1:13 ` Fam Zheng
@ 2014-03-14 8:16 ` Markus Armbruster
0 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2014-03-14 8:16 UTC (permalink / raw)
To: Fam Zheng; +Cc: kwolf, qemu-devel, stefanha
Fam Zheng <famz@redhat.com> writes:
> On Thu, 03/13 14:25, Markus Armbruster wrote:
>> Fam Zheng <famz@redhat.com> writes:
>>
>> > On Wed, 03/12 18:00, Markus Armbruster wrote:
>> >> Opening an encrypted image takes an additional step: setting the key.
>> >> Between open and the key set, the image must not be used.
>> >>
>> >> We have some protection against accidental use in place: you can't
>> >> unpause a guest while we're missing keys. You can, however, hot-plug
>> >> block devices lacking keys into a running guest just fine, or insert
>> >> media lacking keys. In the latter case, notifying the guest of the
>> >> insert is delayed until the key is set, which may suffice to protect
>> >> at least some guests in common usage.
>> >>
>> >> This patch makes the protection apply in more cases, in a rather
>> >> heavy-handed way: it doesn't let you open encrypted images unless
>> >> we're in a paused state.
>> >>
>> >> It doesn't extend the protection to users other than the guest (block
>> >> jobs?). Use of runstate_check() from block.c is disgusting. Best I
>> >> can do right now.
>> >>
>> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> >> ---
>> >> block.c | 8 +++++++-
>> >> stubs/Makefile.objs | 1 +
>> >> stubs/runstate-check.c | 6 ++++++
>> >> 3 files changed, 14 insertions(+), 1 deletion(-)
>> >> create mode 100644 stubs/runstate-check.c
>> >>
>> >> diff --git a/block.c b/block.c
>> >> index f1ef4b0..7604881 100644
>> >> --- a/block.c
>> >> +++ b/block.c
>> >> @@ -1388,12 +1388,18 @@ done:
>> >> ret = -EINVAL;
>> >> goto close_and_fail;
>> >> }
>> >> - QDECREF(options);
>> >>
>> >> if (!bdrv_key_required(bs)) {
>> >> bdrv_dev_change_media_cb(bs, true);
>> >> + } else if (!runstate_check(RUN_STATE_PRELAUNCH)
>> >> + && !runstate_check(RUN_STATE_PAUSED)) { /* HACK */
>> >> + error_setg(errp,
>> >> + "Guest must be stopped for opening of encrypted image");
>> >
>> > Changing error message here breaks qemu-iotests 087.
>>
>> Crap. I'm on vacation until Monday, just checking in to shepherd this
>> patch...
>>
>> On *master*, "make check-block" reports
>>
>> Not run: 016 052 059 064 070 077
>> Failures: 085 087
>> Failed 2 of 34 tests
>>
>
> I didn't run it from "make check-block" (Stefan sent a patch to remove 085 and
> 087 from check-block.
>
> Running command: TEST_DIR=/tmp/qemu-iotests
> QEMU_PROG=../../x86_64-softmmu/qemu-system-x86_64
> QEMU_IMG_PROG=../../qemu-img QEMU_IO_PROG=../../qemu-io
> QEMU_NBD_PROG=../../qemu-nbd ./check -qcow2 -o "" 087
> QEMU -- ../../x86_64-softmmu/qemu-system-x86_64
> QEMU_IMG -- ../../qemu-img
> QEMU_IO -- ../../qemu-io
> QEMU_NBD -- ../../qemu-nbd
> IMGFMT -- qcow2 (compat=1.1)
> IMGPROTO -- file
> PLATFORM -- Linux/x86_64 T430 3.13.6-1-ARCH
> SOCKET_SCM_HELPER --
>
> 087 0s ... - output mismatch (see 087.out.bad)
> --- 087.out 2014-03-12 09:28:04.167060760 +0800
> +++ 087.out.bad 2014-03-14 09:11:59.770326144 +0800
> @@ -31,7 +31,7 @@
> Testing:
> QMP_VERSION
> {"return": {}}
> -{"error": {"class": "GenericError", "desc": "blockdev-add doesn't
> support encrypted devices"}}
> +{"error": {"class": "GenericError", "desc": "could not open disk
> image disk: Guest must be stopped for opening of encrypted image"}}
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP},
> "event": "SHUTDOWN"}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP},
> "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0",
> "tray-open": true}}
> Failures: 087
> Failed 1 of 1 tests
>
> Thanks,
> Fam
I'll update this test to use -S, and add another one for the new failure
mode. Thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2014-03-14 8:16 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-12 17:00 [Qemu-devel] [PATCH] blockdev: Refuse to open encrypted image unless paused Markus Armbruster
2014-03-12 17:19 ` Eric Blake
2014-03-13 9:26 ` Fam Zheng
2014-03-13 13:25 ` Markus Armbruster
2014-03-14 1:13 ` Fam Zheng
2014-03-14 8:16 ` Markus Armbruster
2014-03-13 10:43 ` Paolo Bonzini
2014-03-13 13:18 ` Markus Armbruster
2014-03-13 14:14 ` Paolo Bonzini
2014-03-13 15:00 ` Markus Armbruster
2014-03-13 15:08 ` Paolo Bonzini
2014-03-14 8:15 ` Markus Armbruster
2014-03-13 13:27 ` Eric Blake
2014-03-13 14:19 ` Paolo Bonzini
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).