[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC v2 4/9] libxl_qmp: Move the buffer realloc to the same scope level as read
On Mon, Apr 16, 2018 at 06:32:22PM +0100, Anthony PERARD wrote: > In qmp_next(), the inner loop should only try to parse messages from > QMP, if there is more than one. > > The handling of the receive buffer ('incomplete'), should be done at the > same scope level as read(). It doesn't need to be handle more that once > after a read. > In general I agree this is a better idea than the current code. > Before this patch, when on message what handled, the inner loop would Sorry, I failed to parse "when on message what handled". > restart by adding the 'buffer' into 'incomplete' (after reallocation). > Since 'rd' was not reset, the buffer would be strcat a second time. > After that, the stream from the QMP server would have syntax error, and > the parsor would throw errors. > > This is unlikely to happen as the receive buffer is very large. And > receiving two messages in a row is unlikely. In the current case, this > could be an event and a response to a command. > > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> > --- > tools/libxl/libxl_qmp.c | 31 ++++++++++++++++--------------- > 1 file changed, 16 insertions(+), 15 deletions(-) > > diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c > index 4d207c3842..a25f445fb6 100644 > --- a/tools/libxl/libxl_qmp.c > +++ b/tools/libxl/libxl_qmp.c > @@ -524,23 +524,24 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler > *qmp) > > DEBUG_REPORT_RECEIVED(qmp->domid, qmp->buffer, (int)rd); > > + if (incomplete) { > + size_t current_pos = s - incomplete; > + incomplete = libxl__realloc(gc, incomplete, > + incomplete_size + rd + 1); > + strncat(incomplete + incomplete_size, qmp->buffer, rd); > + s = incomplete + current_pos; This can be dropped, because s is not changed. It is just the reversal of what is a few lines above. > + incomplete_size += rd; > + s_end = incomplete + incomplete_size; > + } else { > + incomplete = libxl__strndup(gc, qmp->buffer, rd); > + incomplete_size = rd; > + s = incomplete; > + s_end = s + rd; > + rd = 0; This can be dropped. And I think we should take this change to change "incomplete" to something more meaningful, like "qmp_msg_buf". > + } > + > do { > char *end = NULL; > - if (incomplete) { > - size_t current_pos = s - incomplete; > - incomplete = libxl__realloc(gc, incomplete, > - incomplete_size + rd + 1); > - strncat(incomplete + incomplete_size, qmp->buffer, rd); > - s = incomplete + current_pos; > - incomplete_size += rd; > - s_end = incomplete + incomplete_size; > - } else { > - incomplete = libxl__strndup(gc, qmp->buffer, rd); > - incomplete_size = rd; > - s = incomplete; > - s_end = s + rd; > - rd = 0; > - } > > end = strstr(s, "\r\n"); > if (end) { > -- > Anthony PERARD > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |