On Tue, Oct 15, 2013 at 10:46:59AM +0800, Osier Yang wrote: > On 14/10/13 21:26, Daniel P. Berrange wrote: > >On Mon, Oct 14, 2013 at 03:22:27PM +0800, Osier Yang wrote: > >><...> > >>/* Size of message length field. Not counted in VIR_NET_MESSAGE_MAX > >> * and VIR_NET_MESSAGE_INITIAL. > >> */ > >>const VIR_NET_MESSAGE_LEN_MAX = 4; > >></...> > >> > >>However, msg->bufferLength includes the length word. The wrong checking > >>was introduced by commit e914dcfd. > >> > >>* src/rpc/virnetmessage.c: > >> - Correct the checking in virNetMessageEncodePayloadRaw > >> - Use a new variable to track the new payload length in > >> virNetMessageEncodePayloadRaw > >>--- > >> src/rpc/virnetmessage.c | 19 +++++++++++++------ > >> 1 file changed, 13 insertions(+), 6 deletions(-) > >> > >>diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c > >>index 8f4e4bc..4c60424 100644 > >>--- a/src/rpc/virnetmessage.c > >>+++ b/src/rpc/virnetmessage.c > >>@@ -346,15 +346,17 @@ int virNetMessageEncodePayload(virNetMessagePtr msg, > >> /* Try to encode the payload. If the buffer is too small increase it. */ > >> while (!(*filter)(&xdr, data)) { > >>- if ((msg->bufferLength - VIR_NET_MESSAGE_LEN_MAX) * 4 > VIR_NET_MESSAGE_MAX) { > >>+ unsigned int newlen = (msg->bufferLength - VIR_NET_MESSAGE_LEN_MAX) * 4 + > >>+ VIR_NET_MESSAGE_LEN_MAX; > >>+ > >>+ if (newlen > VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_LEN_MAX) { > >You've not actually changed the logic here at all - you've just > >added VIR_NET_MESSAGE_LEN_MAX to both sides of the '>'. So this > >change is a no-op. Please drop it. > > Yes, the logic is not changed, but I wanted to calculate the new > buffer length > once instead of twice, and it's more readable for the code. So I'd > like keep it. I don't really find this new version more readable. If you removed the " + VIR_NET_MESSAGE_LEN_MAX" from both the 'newlen' initialization and the 'if()' check, then it might be more readable.... > > > > > > >> virReportError(VIR_ERR_RPC, "%s", _("Unable to encode message payload")); > >> goto error; > >> } > >> xdr_destroy(&xdr); > >>- msg->bufferLength = (msg->bufferLength - VIR_NET_MESSAGE_LEN_MAX) * 4 + > >>- VIR_NET_MESSAGE_LEN_MAX; > >>+ msg->bufferLength = newlen; > >Again, nothing changed. Drop this. ...and added "+ VIR_NET_MESSAGE_LEN_MAX" here. > > > >> if (VIR_REALLOC_N(msg->buffer, msg->bufferLength) < 0) > >> goto error; > >>@@ -426,10 +428,15 @@ int virNetMessageEncodePayloadRaw(virNetMessagePtr msg, > >> /* If the message buffer is too small for the payload increase it accordingly. */ > >> if ((msg->bufferLength - msg->bufferOffset) < len) { > >>- if ((msg->bufferOffset + len) > VIR_NET_MESSAGE_MAX) { > >>+ if ((msg->bufferOffset + len) > > >>+ VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_LEN_MAX) { > >Bracket both sides of the '>' for clarity, not just the left-hand-side. > > > > So except this, Can I get an ACK? > diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c > index 4c60424..79a50f6 100644 > --- a/src/rpc/virnetmessage.c > +++ b/src/rpc/virnetmessage.c > @@ -429,7 +429,7 @@ int virNetMessageEncodePayloadRaw(virNetMessagePtr msg, > /* If the message buffer is too small for the payload increase it accordingly. */ > if ((msg->bufferLength - msg->bufferOffset) < len) { > if ((msg->bufferOffset + len) > > - VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_LEN_MAX) { > + (VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_LEN_MAX)) { > virReportError(VIR_ERR_RPC, > _("Stream data too long to send " > "(%zu bytes needed, %zu bytes available)"), Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list