From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmItz-0000oT-35 for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:07:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmItw-0006hi-Qp for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:07:49 -0400 Received: from mail-yw0-x242.google.com ([2607:f8b0:4002:c05::242]:34467) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmItw-0006hC-Kp for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:07:48 -0400 Received: by mail-yw0-x242.google.com with SMTP id t67so568356ywg.1 for ; Tue, 20 Sep 2016 04:07:48 -0700 (PDT) Sender: Paolo Bonzini References: <20160920114103.27aeea2a@fiorina> From: Paolo Bonzini Message-ID: <30916fa0-a4b2-fa59-a594-38b172099fdb@redhat.com> Date: Tue, 20 Sep 2016 11:59:28 +0200 MIME-Version: 1.0 In-Reply-To: <20160920114103.27aeea2a@fiorina> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH 2/2] qemu-nbd: Add --image-size option List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?VG9tw6HFoSBHb2xlbWJpb3Zza8O9?= , qemu-devel@nongnu.org On 20/09/2016 11:41, Tomáš Golembiovský wrote: > 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. The patch makes sense, but I think the commit message is incorrect because this bug is already fixed by patch 1. Also, the option in the help is --device-size, not --image-size; I would just call it --size. Thanks, Paolo > > Signed-off-by: Tomáš Golembiovský > --- > 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=OFFSET offset into the image\n" > +" -S, --device-size=LEN limit reported device size\n" > " -P, --partition=NUM only expose partition NUM\n" > "\n" > "General purpose options:\n" > @@ -471,10 +472,12 @@ int main(int argc, char **argv) > const char *port = NULL; > char *sockpath = NULL; > char *device = NULL; > - off_t fd_size; > + off_t real_size = 0; > + off_t fd_size = 0; > + bool has_image_size = false; > QemuOpts *sn_opts = NULL; > const char *sn_id_or_name = NULL; > - const char *sopt = "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:"; > + const char *sopt = "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:S:"; > struct option lopt[] = { > { "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 = trace_opt_parse(optarg); > break; > + case 'S': > + ret = qemu_strtoll(optarg, NULL, 0, &fd_size); > + if (ret != 0) { > + error_report("Invalid image size `%s'", optarg); > + exit(EXIT_FAILURE); > + } > + if (fd_size <= 0) { > + error_report("Image size must be positive `%s'", optarg); > + exit(EXIT_FAILURE); > + } > + has_image_size = true; > + break; > } > } > > @@ -894,19 +910,29 @@ int main(int argc, char **argv) > } > > bs->detect_zeroes = detect_zeroes; > - fd_size = blk_getlength(blk); > - if (fd_size < 0) { > + real_size = 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); > } > > - if (dev_offset >= 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 = real_size; > + > + if (dev_offset >= fd_size) { > + error_report("Offset (%lu) has to be smaller than image size (%lu)", > + dev_offset, fd_size); > + exit(EXIT_FAILURE); > + } > + > + fd_size -= 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 -= dev_offset; > > if (partition != -1) { > ret = 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=@var{offset} > The offset into the image > +@item -S, --image-size=@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 of the > +file. > @item -b, --bind=@var{iface} > The interface to bind to (default @samp{0.0.0.0}) > @item -k, --socket=@var{path} >