From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:60311) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qb5oQ-0007IO-Ei for qemu-devel@nongnu.org; Mon, 27 Jun 2011 03:00:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qb5oO-0005Iu-VW for qemu-devel@nongnu.org; Mon, 27 Jun 2011 03:00:50 -0400 Received: from mail-pz0-f45.google.com ([209.85.210.45]:39522) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qb5oO-0005Ii-C5 for qemu-devel@nongnu.org; Mon, 27 Jun 2011 03:00:48 -0400 Received: by pzk30 with SMTP id 30so3023063pzk.4 for ; Mon, 27 Jun 2011 00:00:47 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <1309146518-8998-1-git-send-email-famcool@gmail.com> <1309146518-8998-10-git-send-email-famcool@gmail.com> From: Fam Zheng Date: Mon, 27 Jun 2011 15:00:07 +0800 Message-ID: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v3 09/12] VMDK: open/read/write for monolithicFlat image List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: kwolf@redhat.com, qemu-devel@nongnu.org, hch@lst.de On Mon, Jun 27, 2011 at 12:54 PM, Stefan Hajnoczi wrot= e: > On Mon, Jun 27, 2011 at 4:48 AM, Fam Zheng wrote: >> Parse vmdk decriptor file and open mono flat image. >> @@ -598,6 +600,154 @@ static int vmdk_open_vmdk4(BlockDriverState *bs, i= nt flags) >> =C2=A0 =C2=A0 return ret; >> =C2=A0} >> >> +/* find an option value out of descriptor file */ >> +static int vmdk_parse_description(const char *desc, const char *opt_nam= e, >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0char *buf, int buf_size) >> +{ >> + =C2=A0 =C2=A0char *opt_pos =3D strstr(desc, opt_name); >> + =C2=A0 =C2=A0int r; >> + =C2=A0 =C2=A0const char *end =3D desc + strlen(desc); >> + >> + =C2=A0 =C2=A0if (!opt_pos) { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1; >> + =C2=A0 =C2=A0} >> + =C2=A0 =C2=A0opt_pos +=3D strlen(opt_name) + 2; >> + =C2=A0 =C2=A0if (opt_pos >=3D end) { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1; >> + =C2=A0 =C2=A0} >> + =C2=A0 =C2=A0r =3D sscanf(opt_pos, "%[^\"]s", buf); >> + =C2=A0 =C2=A0return r <=3D 0; >> +} > > This is still unsafe. =C2=A0Please see my comments on the previous versio= n > of this patch. How about this: static int vmdk_parse_description(const char *desc, const char *opt_name, char *buf, int buf_size) { char *opt_pos, *opt_end; const char *end =3D desc + strlen(desc); opt_pos =3D strstr(desc, opt_name); if (!opt_pos) { return -1; } /* Skip "=3D\"" following opt_name */ opt_pos +=3D strlen(opt_name) + 2; if (opt_pos >=3D end) { return -1; } opt_end =3D opt_pos; while (opt_end < end && *opt_end !=3D '"') { opt_end++; } if (opt_end =3D=3D end || buf_size < opt_end - opt_pos + 1) { return -1; } strncpy(buf, opt_pos, opt_end - opt_pos); buf[opt_end - opt_pos] =3D '\0'; return 0; } > >> +static int vmdk_open_desc_file(BlockDriverState *bs, int flags) >> +{ >> + =C2=A0 =C2=A0int ret; >> + =C2=A0 =C2=A0char buf[2048]; >> + =C2=A0 =C2=A0char ct[128]; >> + =C2=A0 =C2=A0BDRVVmdkState *s =3D bs->opaque; >> + >> + =C2=A0 =C2=A0ret =3D bdrv_pread(bs->file, 0, buf, sizeof(buf)); >> + =C2=A0 =C2=A0ret =3D bdrv_pread(bs->file, 0, buf, sizeof(buf)); > > Merge error? =C2=A0Only need to bdrv_pread() once :). > > Stefan > --=20 Best regards! Fam Zheng