From nobody Sat May 11 10:00:20 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1531242373001916.8840329440636; Tue, 10 Jul 2018 10:06:13 -0700 (PDT) Received: from localhost ([::1]:48999 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fcw5b-00052B-U7 for importer@patchew.org; Tue, 10 Jul 2018 13:06:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38360) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fcw0Q-0001Tq-0f for qemu-devel@nongnu.org; Tue, 10 Jul 2018 13:00:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fcw0O-0006GJ-K9 for qemu-devel@nongnu.org; Tue, 10 Jul 2018 13:00:50 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:50390 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fcw0K-0006Df-I9; Tue, 10 Jul 2018 13:00:44 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0D500818A6A6; Tue, 10 Jul 2018 17:00:44 +0000 (UTC) Received: from probe.bos.redhat.com (dhcp-17-177.bos.redhat.com [10.18.17.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id D2E7E111AF21; Tue, 10 Jul 2018 17:00:43 +0000 (UTC) From: John Snow To: qemu-block@nongnu.org Date: Tue, 10 Jul 2018 13:00:40 -0400 Message-Id: <20180710170041.875-2-jsnow@redhat.com> In-Reply-To: <20180710170041.875-1-jsnow@redhat.com> References: <20180710170041.875-1-jsnow@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Tue, 10 Jul 2018 17:00:44 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Tue, 10 Jul 2018 17:00:44 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jsnow@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v6 1/2] file-posix: specify expected filetypes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , John Snow , qemu-devel@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- block/file-posix.c | 39 +++++++++++++++++++++++++++++++-------- qemu-doc.texi | 6 ++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 349f77a3af..e3a262bae4 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -438,7 +438,8 @@ static QemuOptsList raw_runtime_opts =3D { }; =20 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 =3D bs->opaque; QemuOpts *opts; @@ -585,10 +586,32 @@ static int raw_open_common(BlockDriverState *bs, QDic= t *options, error_setg_errno(errp, errno, "Could not stat file"); goto fail; } - if (S_ISREG(st.st_mode)) { - s->discard_zeroes =3D true; - s->has_fallocate =3D true; + + if (!device) { + if (S_ISBLK(st.st_mode)) { + warn_report("Opening a block device as a file using the '%s' " + "driver is deprecated", bs->drv->format_name); + } else if (S_ISCHR(st.st_mode)) { + warn_report("Opening a character device as a file using the '%= s' " + "driver is deprecated", bs->drv->format_name); + } else if (!S_ISREG(st.st_mode)) { + error_setg(errp, "A regular file was expected by the '%s' driv= er, " + "but something else was given", bs->drv->format_nam= e); + ret =3D -EINVAL; + goto fail; + } else { + s->discard_zeroes =3D true; + s->has_fallocate =3D true; + } + } else { + if (!(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { + error_setg(errp, "'%s' driver expects either " + "a character or block device", bs->drv->format_name= ); + ret =3D -EINVAL; + goto fail; + } } + if (S_ISBLK(st.st_mode)) { #ifdef BLKDISCARDZEROES unsigned int arg; @@ -641,7 +664,7 @@ static int raw_open(BlockDriverState *bs, QDict *option= s, int flags, BDRVRawState *s =3D bs->opaque; =20 s->type =3D FTYPE_FILE; - return raw_open_common(bs, options, flags, 0, errp); + return raw_open_common(bs, options, flags, 0, false, errp); } =20 typedef enum { @@ -2932,7 +2955,7 @@ hdev_open_Mac_error: =20 s->type =3D FTYPE_FILE; =20 - ret =3D raw_open_common(bs, options, flags, 0, &local_err); + ret =3D raw_open_common(bs, options, flags, 0, true, &local_err); if (ret < 0) { error_propagate(errp, local_err); #if defined(__APPLE__) && defined(__MACH__) @@ -3163,7 +3186,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *op= tions, int flags, s->type =3D FTYPE_CD; =20 /* 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); } =20 static int cdrom_probe_device(const char *filename) @@ -3277,7 +3300,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *op= tions, int flags, =20 s->type =3D FTYPE_CD; =20 - ret =3D raw_open_common(bs, options, flags, 0, &local_err); + ret =3D 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 d3924e928e..bb0dc45cb0 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -2954,6 +2954,12 @@ replacement since it is not needed anymore. The @option{-enable-hax} option has been replaced by @option{-accel hax}. Both options have been introduced in QEMU version 2.9.0. =20 +@subsection -drive file=3Djson:@{...@{'driver':'file'@}@} (since 3.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. + @section QEMU Machine Protocol (QMP) commands =20 @subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0) --=20 2.14.4 From nobody Sat May 11 10:00:20 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1531242184613333.2104173509334; Tue, 10 Jul 2018 10:03:04 -0700 (PDT) Received: from localhost ([::1]:48976 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fcw2Z-0002WD-NO for importer@patchew.org; Tue, 10 Jul 2018 13:03:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38371) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fcw0R-0001Ud-1w for qemu-devel@nongnu.org; Tue, 10 Jul 2018 13:00:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fcw0P-0006Gs-T5 for qemu-devel@nongnu.org; Tue, 10 Jul 2018 13:00:51 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:42288 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fcw0K-0006Dp-Ob; Tue, 10 Jul 2018 13:00:44 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 435498D682; Tue, 10 Jul 2018 17:00:44 +0000 (UTC) Received: from probe.bos.redhat.com (dhcp-17-177.bos.redhat.com [10.18.17.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 14D56111AF21; Tue, 10 Jul 2018 17:00:44 +0000 (UTC) From: John Snow To: qemu-block@nongnu.org Date: Tue, 10 Jul 2018 13:00:41 -0400 Message-Id: <20180710170041.875-3-jsnow@redhat.com> In-Reply-To: <20180710170041.875-1-jsnow@redhat.com> References: <20180710170041.875-1-jsnow@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 10 Jul 2018 17:00:44 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 10 Jul 2018 17:00:44 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jsnow@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v6 2/2] iotests: add test 226 for file driver types X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , John Snow , qemu-devel@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Test that we're rejecting what we ought to for file, host_driver and host_cdrom drivers. Test that we're seeing the deprecated message for block and chardevs on the file driver. Signed-off-by: John Snow --- tests/qemu-iotests/226 | 66 ++++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/226.out | 26 ++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 93 insertions(+) create mode 100755 tests/qemu-iotests/226 create mode 100644 tests/qemu-iotests/226.out diff --git a/tests/qemu-iotests/226 b/tests/qemu-iotests/226 new file mode 100755 index 0000000000..460aea2fc9 --- /dev/null +++ b/tests/qemu-iotests/226 @@ -0,0 +1,66 @@ +#!/bin/bash +# +# This test covers expected filetypes for the file, host_cdrom and +# host_device drivers. +# +# Copyright (C) 2018 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=3Djsnow@redhat.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +here=3D`pwd` +status=3D1 # failure is the default! + +_cleanup() +{ + rmdir "$TEST_IMG" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.pattern + +# Generic format, but tests file-protocol specific error handling +_supported_fmt generic +_supported_proto file +_supported_os Linux + +# Create something decidedly not a file, blockdev or chardev... +mkdir "$TEST_IMG" + +for PROTO in "file" "host_device" "host_cdrom"; do + echo + echo "=3D=3D=3D Testing with driver:$PROTO =3D=3D=3D" + echo + echo "=3D=3D Testing RO =3D=3D" + $QEMU_IO -c "open -r -o driver=3D$PROTO,filename=3D$TEST_IMG" 2>&1 | _= filter_imgfmt | _filter_testdir + $QEMU_IO -c "open -r -o driver=3D$PROTO,filename=3D/dev/null" 2>&1 | _= filter_imgfmt + echo "=3D=3D Testing RW =3D=3D" + $QEMU_IO -c "open -o driver=3D$PROTO,filename=3D$TEST_IMG" 2>&1 | _fil= ter_imgfmt | _filter_testdir + $QEMU_IO -c "open -o driver=3D$PROTO,filename=3D/dev/null" 2>&1 | _fil= ter_imgfmt +done + +# success, all done +echo +echo "*** done" +rm -f $seq.full +status=3D0 diff --git a/tests/qemu-iotests/226.out b/tests/qemu-iotests/226.out new file mode 100644 index 0000000000..8c0d060ffc --- /dev/null +++ b/tests/qemu-iotests/226.out @@ -0,0 +1,26 @@ +QA output created by 226 + +=3D=3D=3D Testing with driver:file =3D=3D=3D + +=3D=3D Testing RO =3D=3D +can't open: A regular file was expected by the 'file' driver, but somethin= g else was given +warning: Opening a character device as a file using the 'file' driver is d= eprecated +=3D=3D Testing RW =3D=3D +can't open: Could not open 'TEST_DIR/t.IMGFMT': Is a directory +warning: Opening a character device as a file using the 'file' driver is d= eprecated + +=3D=3D=3D Testing with driver:host_device =3D=3D=3D + +=3D=3D Testing RO =3D=3D +can't open: 'host_device' driver expects either a character or block device +=3D=3D Testing RW =3D=3D +can't open: Could not open 'TEST_DIR/t.IMGFMT': Is a directory + +=3D=3D=3D Testing with driver:host_cdrom =3D=3D=3D + +=3D=3D Testing RO =3D=3D +can't open: 'host_cdrom' driver expects either a character or block device +=3D=3D Testing RW =3D=3D +can't open: Could not open 'TEST_DIR/t.IMGFMT': Is a directory + +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 1c9f679821..68f66259b2 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -223,3 +223,4 @@ 222 rw auto quick 223 rw auto quick 225 rw auto quick +226 auto quick --=20 2.14.4