From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55139) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmHYP-0000n5-OC for qemu-devel@nongnu.org; Tue, 20 Sep 2016 05:41:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmHYN-0003zo-If for qemu-devel@nongnu.org; Tue, 20 Sep 2016 05:41:28 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60448) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmHYN-0003z2-8o for qemu-devel@nongnu.org; Tue, 20 Sep 2016 05:41:27 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD17C3B3C5 for ; Tue, 20 Sep 2016 09:41:26 +0000 (UTC) Date: Tue, 20 Sep 2016 11:41:03 +0200 From: =?UTF-8?B?VG9tw6HFoSBHb2xlbWJpb3Zza8O9?= Message-ID: <20160920114103.27aeea2a@fiorina> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 2/2] qemu-nbd: Add --image-size option List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , qemu-devel@nongnu.org When image is part of the file it makes sense to limit the length of the image in the file. Otherwise it is assumed that the image spans to the end of the file. This assumption may lead to reads/writes outside of the image and thus lead to errors or data corruption. To limit the assumed image size new option is introduced. Signed-off-by: Tom=C3=A1=C5=A1 Golembiovsk=C3=BD --- qemu-nbd.c | 44 +++++++++++++++++++++++++++++++++++--------- qemu-nbd.texi | 4 ++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/qemu-nbd.c b/qemu-nbd.c index 629bce1..7ed52f7 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -85,6 +85,7 @@ static void usage(const char *name) "\n" "Exposing part of the image:\n" " -o, --offset=3DOFFSET offset into the image\n" +" -S, --device-size=3DLEN limit reported device size\n" " -P, --partition=3DNUM only expose partition NUM\n" "\n" "General purpose options:\n" @@ -471,10 +472,12 @@ int main(int argc, char **argv) const char *port =3D NULL; char *sockpath =3D NULL; char *device =3D NULL; - off_t fd_size; + off_t real_size =3D 0; + off_t fd_size =3D 0; + bool has_image_size =3D false; QemuOpts *sn_opts =3D NULL; const char *sn_id_or_name =3D NULL; - const char *sopt =3D "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:"; + const char *sopt =3D "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:S:"; struct option lopt[] =3D { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, @@ -482,6 +485,7 @@ int main(int argc, char **argv) { "port", required_argument, NULL, 'p' }, { "socket", required_argument, NULL, 'k' }, { "offset", required_argument, NULL, 'o' }, + { "image-size", required_argument, NULL, 'S' }, { "read-only", no_argument, NULL, 'r' }, { "partition", required_argument, NULL, 'P' }, { "connect", required_argument, NULL, 'c' }, @@ -714,6 +718,18 @@ int main(int argc, char **argv) g_free(trace_file); trace_file =3D trace_opt_parse(optarg); break; + case 'S': + ret =3D qemu_strtoll(optarg, NULL, 0, &fd_size); + if (ret !=3D 0) { + error_report("Invalid image size `%s'", optarg); + exit(EXIT_FAILURE); + } + if (fd_size <=3D 0) { + error_report("Image size must be positive `%s'", optarg); + exit(EXIT_FAILURE); + } + has_image_size =3D true; + break; } } =20 @@ -894,19 +910,29 @@ int main(int argc, char **argv) } =20 bs->detect_zeroes =3D detect_zeroes; - fd_size =3D blk_getlength(blk); - if (fd_size < 0) { + real_size =3D blk_getlength(blk); + if (real_size < 0) { error_report("Failed to determine the image length: %s", - strerror(-fd_size)); + strerror(-real_size)); exit(EXIT_FAILURE); } =20 - if (dev_offset >=3D fd_size) { - error_report("Offset (%lu) has to be smaller than the image size (= %lu)", - dev_offset, fd_size); + if (!has_image_size) { + fd_size =3D real_size; + + if (dev_offset >=3D fd_size) { + error_report("Offset (%lu) has to be smaller than image size (= %lu)", + dev_offset, fd_size); + exit(EXIT_FAILURE); + } + + fd_size -=3D dev_offset; + } else if ((dev_offset + fd_size) > real_size) { + error_report("Offset (%lu) plus image size (%lu) has to be smaller= " + "than or equal to real image size (%lu)", + dev_offset, fd_size, real_size); exit(EXIT_FAILURE); } - fd_size -=3D dev_offset; =20 if (partition !=3D -1) { ret =3D find_partition(blk, partition, &dev_offset, &fd_size); diff --git a/qemu-nbd.texi b/qemu-nbd.texi index 91ebf04..c589525 100644 --- a/qemu-nbd.texi +++ b/qemu-nbd.texi @@ -30,6 +30,10 @@ credentials for the qemu-nbd server. The TCP port to listen on (default @samp{10809}) @item -o, --offset=3D@var{offset} The offset into the image +@item -S, --image-size=3D@var{length} +The size of the image to present to client. This is useful in combination = with +@var{-o} when the image is embedded in file but does not span to the end o= f the +file. @item -b, --bind=3D@var{iface} The interface to bind to (default @samp{0.0.0.0}) @item -k, --socket=3D@var{path} --=20 2.9.3