From patchwork Wed Jul 25 19:47:24 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 173251 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B79A62C008E for ; Thu, 26 Jul 2012 05:47:36 +1000 (EST) Received: from localhost ([::1]:57294 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su7YU-0006py-TD for incoming@patchwork.ozlabs.org; Wed, 25 Jul 2012 15:47:34 -0400 Received: from eggs.gnu.org ([208.118.235.92]:47878) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su7YO-0006pi-4Z for qemu-devel@nongnu.org; Wed, 25 Jul 2012 15:47:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Su7YM-0002Mg-Fo for qemu-devel@nongnu.org; Wed, 25 Jul 2012 15:47:28 -0400 Received: from mail-gg0-f173.google.com ([209.85.161.173]:41549) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su7YM-0002Ll-BC for qemu-devel@nongnu.org; Wed, 25 Jul 2012 15:47:26 -0400 Received: by ggnp1 with SMTP id p1so1122311ggn.4 for ; Wed, 25 Jul 2012 12:47:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-gm-message-state; bh=9lniZlbwyKctZUb86l5H+ZlF7sOuspEaehHbzEMOUDE=; b=mey1stn3YoO8qwR6RQRyF+tixgRlfILY6Q0nNZZfUroCllEt34AZgSMRvEMa1iovkd EE0Wj7qaJjbChOGnvsGxQmAbphklkinnxb5drWICMUkHAxWp01DzbUaykiBrolwsX6dc vUZWiIIAWI3CrpC9aadOcb7MAInSnQPTxlYaNpSLUBvxXC6JAm0MbN1dnvvRmXGUqKnG eUctasHv5YZabS4LSYYkge97PBrYWzQifCREwSngx3MM8cnzvOnm1Rvqa+gxT+n8CtEz ZVM7GN1pXffgSvxhhhJPhmicHo7XZzZ8LXhapXn3gqB1bxrvTCl4a/+ZkoWI73sESGIu QWrQ== MIME-Version: 1.0 Received: by 10.66.86.2 with SMTP id l2mr14948058paz.58.1343245644635; Wed, 25 Jul 2012 12:47:24 -0700 (PDT) Received: by 10.66.246.168 with HTTP; Wed, 25 Jul 2012 12:47:24 -0700 (PDT) In-Reply-To: <20120725161813.538012f0@doriath.home> References: <1343235256-26310-1-git-send-email-lcapitulino@redhat.com> <1343235256-26310-8-git-send-email-lcapitulino@redhat.com> <20120725161813.538012f0@doriath.home> Date: Wed, 25 Jul 2012 20:47:24 +0100 Message-ID: From: Peter Maydell To: Luiz Capitulino X-Gm-Message-State: ALoCoQny/dvJ01F/0QSnWPAfWW8JREQI63XJayxdnVmy/NQXrt6PhNZ1AMHrOLQkgWNu+euq6FvQ X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.161.173 Cc: mdroth@linux.vnet.ibm.com, pbonzini@redhat.com, aliguori@us.ibm.com, qemu-devel@nongnu.org, armbru@redhat.com Subject: Re: [Qemu-devel] [PATCH 07/11] qapi: qapi.py: allow the "'" character be escaped X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On 25 July 2012 20:18, Luiz Capitulino wrote: > Peter Maydell wrote: >> On 25 July 2012 17:54, Luiz Capitulino wrote: >> > --- a/scripts/qapi.py >> > +++ b/scripts/qapi.py >> > @@ -21,7 +21,9 @@ def tokenize(data): >> > elif data[0] == "'": >> > data = data[1:] >> > string = '' >> > - while data[0] != "'": >> > + while True: >> > + if data[0] == "'" and string[len(string)-1] != "\\": >> > + break >> > string += data[0] >> > data = data[1:] >> > data = data[1:] >> >> Won't this cause us to look at string[-1] if >> the input data has two ' characters in a row? > > Non escaped? If you meant '' that's a zero length string and should work, but > if you meant 'foo '' bar' that's illegal, because ' characters should be escaped. I meant the zero length string case. yes. We come in with data = "''", strip the first ' and set string to empty. Then in the first time in the while loop data[0] is "'" but len(string) is 0 and so we'll do string[-1] which I think will throw an exception. ...and yep, quick test of a nobbbled qapi-schema.json confirms: $ python /home/pm215/src/qemu/qemu/scripts/qapi-types.py -h -o "." < /home/pm215/src/qemu/qemu/qapi-schema.json Traceback (most recent call last): File "/home/pm215/src/qemu/qemu/scripts/qapi-types.py", line 260, in exprs = parse_schema(sys.stdin) File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 78, in parse_schema expr_eval = evaluate(expr) File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 64, in evaluate return parse(map(lambda x: x, tokenize(string)))[0] File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 25, in tokenize if data[0] == "'" and string[len(string)-1] != "\\": IndexError: string index out of range Try this (very lightly tested but seems to work): (feel free to do something nicer than raising an exception on the syntax error, and sorry I'm feeling too lazy to make this an actual patch email) Signed-off-by: Peter Maydell (if anybody wants to be able to use '\\' to escape escapes then this approach is a bit stuffed, of course.) > PS: Peter, I get claustrophobic when reading emails from you :) I can add more blank lines if that helps? :-) -- PMM --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -21,10 +21,16 @@ def tokenize(data): elif data[0] == "'": data = data[1:] string = '' - while data[0] != "'": - string += data[0] - data = data[1:] - data = data[1:] + while True: + pos = data.find("'") + if pos == -1: + raise Exception("Mismatched quotes") + string += data[0:pos] + data = data[pos+1:] + if len(string) == 0 or string[-1] != "\\": + # found a ' and it wasn't escaped + break + string = string[0:-1] + "'" yield string def parse(tokens):