From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:41657) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RAjL7-0004p3-1T for qemu-devel@nongnu.org; Mon, 03 Oct 2011 10:17:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RAjL5-0003fT-Tt for qemu-devel@nongnu.org; Mon, 03 Oct 2011 10:17:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19330) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RAjL5-0003fJ-M2 for qemu-devel@nongnu.org; Mon, 03 Oct 2011 10:17:51 -0400 Date: Mon, 3 Oct 2011 16:18:54 +0200 From: "Michael S. Tsirkin" Message-ID: <20111003141852.GD19689@redhat.com> References: <1316443309-23843-1-git-send-email-mdroth@linux.vnet.ibm.com> <4E88C7DB.9090105@linux.vnet.ibm.com> <20111002210802.GC8072@redhat.com> <4E89B0D4.3090203@us.ibm.com> <4E89B43B.4080000@linux.vnet.ibm.com> <4E89B627.7010008@us.ibm.com> <20111003133040.GC18920@redhat.com> <4E89BD15.1040708@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4E89BD15.1040708@codemonkey.ws> Subject: Re: [Qemu-devel] [RFC] New Migration Protocol using Visitor Interface List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: aliguori@linux.vnet.ibm.com, Anthony Liguori , Stefan Berger , qemu-devel@nongnu.org, Michael Roth On Mon, Oct 03, 2011 at 08:48:05AM -0500, Anthony Liguori wrote: > On 10/03/2011 08:30 AM, Michael S. Tsirkin wrote: > >On Mon, Oct 03, 2011 at 08:18:31AM -0500, Anthony Liguori wrote: > >>On 10/03/2011 08:10 AM, Stefan Berger wrote: > >>>I am doing that. Indefinite length encoding *would* be a problem because you > >>>cannot push the size onto the stack so that you could skip to the end of the > >>>structure. > >> > >>For an indefinite length encoding, you just have to keep reading the > >>stream at end_struct until you hit the canary tag ignoring anything > >>you encounter. > >> > >>Regards, > >> > >>Anthony Liguori > > > >That's not exactly right: one indefinite length encoding can be nested > >within the other. So what we must do is keep reading, read out, > >decode and skip regular length encodings, and count the > >nesting of indefinite length encodings. When we see bit 7 set, > >we increase nesting. When we see end of content, we descrease nesting. > >Stop when nesting reaches 0. > > Yes, you basically have a skip field in the Visitor. If skip is > set, then don't actually marshal to anything. So: > > type_int (et al.) > if (!skip) { > store to passed in int > } > increment offset > > Then when you want to skip to the end of the indefinite, you do something like: > > skip_indefinite: > while tag != CANARY: > if tag == INT: > visit_type_int(v, NULL, NULL, errp); > elif tag == STRING: > visit_type_str(v, NULL, NULL, errp); > elif tag == INDEFINITE: > visit_start_struct(v, NULL, NULL, errp); > skip_indefinite(v, errp); > visit_end_struct(v, NULL, NULL, errp); > > end_struct: > v->skip = true; > skip_indefinite(v, errp); > v->skip = false; > > Regards, > > Anthony Liguori This implementation is recursive, which has the problem of wasting unlimited resources to skip bad input. And we really do not need to look at tag at all. Just the length. -- MST