* [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
@ 2018-01-19 22:47 John Snow
2018-01-19 23:03 ` Eric Blake
0 siblings, 1 reply; 6+ messages in thread
From: John Snow @ 2018-01-19 22:47 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, qemu-devel, John Snow
Adjust each caller of raw_open_common to specify if they are expecting
host and character devices or not. Tighten expectations of file types upon
open in the common code and refuse types that are not expected.
This has two effects:
(1) Character and block devices are now considered deprecated for the
'file' driver, which expects only S_IFREG, and
(2) no file-posix driver (file, host_cdrom, or host_device) can open
directories now.
I don't think there's a legitimate reason to open directories as if
they were files. This prevents QEMU from opening and attempting to probe
a directory inode, which can break in exciting ways. One of those ways
is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
size instead of EISDIR. This can coax QEMU into responding with a
confusing "file too big" instead of "Hey, that's not a file".
See: https://bugs.launchpad.net/qemu/+bug/1739304/
Signed-off-by: John Snow <jsnow@redhat.com>
---
v4: fixing doc building bug, sorry :(
block/file-posix.c | 37 +++++++++++++++++++++++++++++--------
qemu-doc.texi | 6 ++++++
2 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 36ee89e940..61fac1d2a4 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -417,7 +417,8 @@ static QemuOptsList raw_runtime_opts = {
};
static int raw_open_common(BlockDriverState *bs, QDict *options,
- int bdrv_flags, int open_flags, Error **errp)
+ int bdrv_flags, int open_flags,
+ bool device, Error **errp)
{
BDRVRawState *s = bs->opaque;
QemuOpts *opts;
@@ -556,10 +557,30 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
error_setg_errno(errp, errno, "Could not stat file");
goto fail;
}
- if (S_ISREG(st.st_mode)) {
- s->discard_zeroes = true;
- s->has_fallocate = true;
+
+ if (!device) {
+ if (S_ISBLK(st.st_mode)) {
+ warn_report("Opening a block device as file using 'file' "
+ "driver is deprecated");
+ } else if (S_ISCHR(st.st_mode)) {
+ warn_report("Opening a character device as file using the 'file' "
+ "driver is deprecated");
+ } else if (!S_ISREG(st.st_mode)) {
+ error_setg(errp, "A regular file was expected by the 'file' driver, "
+ "but something else was given");
+ goto fail;
+ } else {
+ s->discard_zeroes = true;
+ s->has_fallocate = true;
+ }
+ } else {
+ if (!(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {
+ error_setg(errp, "host_device/host_cdrom driver expects either "
+ "a character or block device");
+ goto fail;
+ }
}
+
if (S_ISBLK(st.st_mode)) {
#ifdef BLKDISCARDZEROES
unsigned int arg;
@@ -611,7 +632,7 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
BDRVRawState *s = bs->opaque;
s->type = FTYPE_FILE;
- return raw_open_common(bs, options, flags, 0, errp);
+ return raw_open_common(bs, options, flags, 0, false, errp);
}
typedef enum {
@@ -2575,7 +2596,7 @@ hdev_open_Mac_error:
s->type = FTYPE_FILE;
- ret = raw_open_common(bs, options, flags, 0, &local_err);
+ ret = raw_open_common(bs, options, flags, 0, true, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
#if defined(__APPLE__) && defined(__MACH__)
@@ -2802,7 +2823,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
s->type = FTYPE_CD;
/* open will not fail even if no CD is inserted, so add O_NONBLOCK */
- return raw_open_common(bs, options, flags, O_NONBLOCK, errp);
+ return raw_open_common(bs, options, flags, O_NONBLOCK, true, errp);
}
static int cdrom_probe_device(const char *filename)
@@ -2915,7 +2936,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
s->type = FTYPE_CD;
- ret = raw_open_common(bs, options, flags, 0, &local_err);
+ ret = raw_open_common(bs, options, flags, 0, true, &local_err);
if (ret) {
error_propagate(errp, local_err);
return ret;
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 3e9eb819a6..8c94dcf8a6 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -2708,6 +2708,12 @@ that can be specified with the ``-device'' parameter.
The drive addr argument is replaced by the the addr argument
that can be specified with the ``-device'' parameter.
+@subsection -drive file=json:@{...@{'driver':'file'@}@} (since 2.12.0)
+
+The 'file' driver for drives is no longer appropriate for character or host
+devices and will only accept regular files (S_IFREG). The correct driver
+for these file types is 'host_cdrom' or 'host_device' as appropriate.
+
@subsection -net dump (since 2.10.0)
The ``--net dump'' argument is now replaced with the
--
2.14.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
2018-01-19 22:47 [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes John Snow
@ 2018-01-19 23:03 ` Eric Blake
2018-01-31 18:39 ` John Snow
2018-03-13 17:20 ` John Snow
0 siblings, 2 replies; 6+ messages in thread
From: Eric Blake @ 2018-01-19 23:03 UTC (permalink / raw)
To: John Snow, qemu-block; +Cc: kwolf, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 1241 bytes --]
On 01/19/2018 04:47 PM, John Snow wrote:
> Adjust each caller of raw_open_common to specify if they are expecting
> host and character devices or not. Tighten expectations of file types upon
> open in the common code and refuse types that are not expected.
>
> This has two effects:
>
> (1) Character and block devices are now considered deprecated for the
> 'file' driver, which expects only S_IFREG, and
> (2) no file-posix driver (file, host_cdrom, or host_device) can open
> directories now.
>
> I don't think there's a legitimate reason to open directories as if
> they were files. This prevents QEMU from opening and attempting to probe
> a directory inode, which can break in exciting ways. One of those ways
> is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
> size instead of EISDIR. This can coax QEMU into responding with a
> confusing "file too big" instead of "Hey, that's not a file".
>
> See: https://bugs.launchpad.net/qemu/+bug/1739304/
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
Reviewed-by: Eric Blake <eblake@redhat.com>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
2018-01-19 23:03 ` Eric Blake
@ 2018-01-31 18:39 ` John Snow
2018-03-13 17:20 ` John Snow
1 sibling, 0 replies; 6+ messages in thread
From: John Snow @ 2018-01-31 18:39 UTC (permalink / raw)
To: Eric Blake, qemu-block; +Cc: kwolf, qemu-devel
ping
On 01/19/2018 06:03 PM, Eric Blake wrote:
> On 01/19/2018 04:47 PM, John Snow wrote:
>> Adjust each caller of raw_open_common to specify if they are expecting
>> host and character devices or not. Tighten expectations of file types upon
>> open in the common code and refuse types that are not expected.
>>
>> This has two effects:
>>
>> (1) Character and block devices are now considered deprecated for the
>> 'file' driver, which expects only S_IFREG, and
>> (2) no file-posix driver (file, host_cdrom, or host_device) can open
>> directories now.
>>
>> I don't think there's a legitimate reason to open directories as if
>> they were files. This prevents QEMU from opening and attempting to probe
>> a directory inode, which can break in exciting ways. One of those ways
>> is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
>> size instead of EISDIR. This can coax QEMU into responding with a
>> confusing "file too big" instead of "Hey, that's not a file".
>>
>> See: https://bugs.launchpad.net/qemu/+bug/1739304/
>> Signed-off-by: John Snow <jsnow@redhat.com>
>> ---
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
2018-01-19 23:03 ` Eric Blake
2018-01-31 18:39 ` John Snow
@ 2018-03-13 17:20 ` John Snow
2018-03-19 15:29 ` Kevin Wolf
1 sibling, 1 reply; 6+ messages in thread
From: John Snow @ 2018-03-13 17:20 UTC (permalink / raw)
To: Eric Blake, qemu-block; +Cc: kwolf, qemu-devel
On 01/19/2018 06:03 PM, Eric Blake wrote:
> On 01/19/2018 04:47 PM, John Snow wrote:
>> Adjust each caller of raw_open_common to specify if they are expecting
>> host and character devices or not. Tighten expectations of file types upon
>> open in the common code and refuse types that are not expected.
>>
>> This has two effects:
>>
>> (1) Character and block devices are now considered deprecated for the
>> 'file' driver, which expects only S_IFREG, and
>> (2) no file-posix driver (file, host_cdrom, or host_device) can open
>> directories now.
>>
>> I don't think there's a legitimate reason to open directories as if
>> they were files. This prevents QEMU from opening and attempting to probe
>> a directory inode, which can break in exciting ways. One of those ways
>> is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
>> size instead of EISDIR. This can coax QEMU into responding with a
>> confusing "file too big" instead of "Hey, that's not a file".
>>
>> See: https://bugs.launchpad.net/qemu/+bug/1739304/
>> Signed-off-by: John Snow <jsnow@redhat.com>
>> ---
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
>
Whoops, I let this one rot. It could still be considered a bugfix for
next week.
--js
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
2018-03-13 17:20 ` John Snow
@ 2018-03-19 15:29 ` Kevin Wolf
2018-03-19 16:18 ` John Snow
0 siblings, 1 reply; 6+ messages in thread
From: Kevin Wolf @ 2018-03-19 15:29 UTC (permalink / raw)
To: John Snow; +Cc: Eric Blake, qemu-block, qemu-devel
Am 13.03.2018 um 18:20 hat John Snow geschrieben:
>
>
> On 01/19/2018 06:03 PM, Eric Blake wrote:
> > On 01/19/2018 04:47 PM, John Snow wrote:
> >> Adjust each caller of raw_open_common to specify if they are expecting
> >> host and character devices or not. Tighten expectations of file types upon
> >> open in the common code and refuse types that are not expected.
> >>
> >> This has two effects:
> >>
> >> (1) Character and block devices are now considered deprecated for the
> >> 'file' driver, which expects only S_IFREG, and
> >> (2) no file-posix driver (file, host_cdrom, or host_device) can open
> >> directories now.
> >>
> >> I don't think there's a legitimate reason to open directories as if
> >> they were files. This prevents QEMU from opening and attempting to probe
> >> a directory inode, which can break in exciting ways. One of those ways
> >> is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
> >> size instead of EISDIR. This can coax QEMU into responding with a
> >> confusing "file too big" instead of "Hey, that's not a file".
> >>
> >> See: https://bugs.launchpad.net/qemu/+bug/1739304/
> >> Signed-off-by: John Snow <jsnow@redhat.com>
> >> ---
> >
> > Reviewed-by: Eric Blake <eblake@redhat.com>
>
> Whoops, I let this one rot. It could still be considered a bugfix for
> next week.
Yes, we should take this as a bugfix. Needs a rebase, though.
Kevin
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes
2018-03-19 15:29 ` Kevin Wolf
@ 2018-03-19 16:18 ` John Snow
0 siblings, 0 replies; 6+ messages in thread
From: John Snow @ 2018-03-19 16:18 UTC (permalink / raw)
To: Kevin Wolf; +Cc: Eric Blake, qemu-block, qemu-devel
On 03/19/2018 11:29 AM, Kevin Wolf wrote:
> Am 13.03.2018 um 18:20 hat John Snow geschrieben:
>>
>>
>> On 01/19/2018 06:03 PM, Eric Blake wrote:
>>> On 01/19/2018 04:47 PM, John Snow wrote:
>>>> Adjust each caller of raw_open_common to specify if they are expecting
>>>> host and character devices or not. Tighten expectations of file types upon
>>>> open in the common code and refuse types that are not expected.
>>>>
>>>> This has two effects:
>>>>
>>>> (1) Character and block devices are now considered deprecated for the
>>>> 'file' driver, which expects only S_IFREG, and
>>>> (2) no file-posix driver (file, host_cdrom, or host_device) can open
>>>> directories now.
>>>>
>>>> I don't think there's a legitimate reason to open directories as if
>>>> they were files. This prevents QEMU from opening and attempting to probe
>>>> a directory inode, which can break in exciting ways. One of those ways
>>>> is lseek on ext4/xfs, which will return 0x7fffffffffffffff as the file
>>>> size instead of EISDIR. This can coax QEMU into responding with a
>>>> confusing "file too big" instead of "Hey, that's not a file".
>>>>
>>>> See: https://bugs.launchpad.net/qemu/+bug/1739304/
>>>> Signed-off-by: John Snow <jsnow@redhat.com>
>>>> ---
>>>
>>> Reviewed-by: Eric Blake <eblake@redhat.com>
>>
>> Whoops, I let this one rot. It could still be considered a bugfix for
>> next week.
>
> Yes, we should take this as a bugfix. Needs a rebase, though.
>
> Kevin
>
You got it.
--js
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-03-19 16:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-19 22:47 [Qemu-devel] [PATCH v4] file-posix: specify expected filetypes John Snow
2018-01-19 23:03 ` Eric Blake
2018-01-31 18:39 ` John Snow
2018-03-13 17:20 ` John Snow
2018-03-19 15:29 ` Kevin Wolf
2018-03-19 16:18 ` John Snow
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).