On Thu, Jun 01, 2023 at 08:00:55AM -0500, Eric Blake wrote:
> > > @@ -83,13 +96,18 @@  REPLY.STRUCTURED_REPLY.CHECK:
> > >     * not worth keeping the connection alive.
> > >     */
> > >    if (length > MAX_REQUEST_SIZE + sizeof 
> > > h->sbuf.reply.payload.offset_data) {
> > > -    set_error (0, "invalid server reply length %" PRIu32, length);
> > > +    set_error (0, "invalid server reply length %" PRIu64, length);
> > >      SET_NEXT_STATE (%.DEAD);
> > >      return 0;
> > >    }
> > > +  /* For convenience, we now normalize extended replies into compact,
> > > +   * doable since we validated that payload length fits in 32 bits.
> > > +   */
> > > +  h->sbuf.reply.hdr.structured.length = length;
> > 
> > (8) I'm very confused by this. For an extended reply, this will
> > overwrite the "offset" field.
> 
> At one point, I considered normalizing in the opposite direction (take
> structured replies and widen them into the extended header form); it
> required touching more lines of code, so I didn't pursue it at the
> time.  But I can see how compressing things down (intentionally
> throwing away information we will no longer reference) can be
> confusing without good comments, so at a minimum, I will be adding
> comments, if not outright going with the widening rather than
> narrowing approach.

In fact, doing it in place is bad.  Later code in this function can
trigger a transition to state RESYNC, which assumes
sbuf.reply.hdr.structured.length still holds the wire value, not the
normalized value.  I'm fixing it up by creating h->payload_left,
initialized in START to the endian-corrected wire value, and then
decremented as various states peel off parts of the payload, so that
FINISH can then assert all payload has been accounted for.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to