[libvirt] [PATCH 2/3] Routine to truncate virBuffer

Bharata B Rao bharata at linux.vnet.ibm.com
Fri Nov 11 12:20:01 UTC 2011


On Mon, Nov 07, 2011 at 11:12:07AM -0700, Eric Blake wrote:
> On 11/06/2011 06:58 AM, Bharata B Rao wrote:
> >Routine to truncate virBuffer
> >
> >From: Bharata B Rao<bharata at linux.vnet.ibm.com>
> >
> >Add a helper to truncate virBuffer.
> >
> >/**
> >  * virBufferTruncate:
> 
> >+++ b/src/util/buf.c
> >@@ -123,6 +123,31 @@ virBufferGrow(virBufferPtr buf, unsigned int len)
> >  }
> >
> >  /**
> >+ * virBufferTruncate:
> >+ * @buf:  the buffer
> >+ * @len:  number of bytes by which the buffer is truncated
> >+ *
> >+ * Truncate the buffer by @len bytes.
> >+ *
> >+ * Returns zero on success or -1 on error
> >+ */
> >+int
> >+virBufferTruncate(virBufferPtr buf, unsigned int len)
> 
> What good is returning an error, given that callers already have to
> use virBufferError for detecting other errors, and given that you
> aren't marking the function as ATTRIBUTE_RETURN_CHECK to require
> callers to respect that error?  One of the points of the virBuffer
> API is that most functions can return void (for example, see
> virBufferAdjustIndent), because the user doesn't care about error
> checking until the end.

Ok, point taken.

> 
> >+{
> >+    if (buf->error)
> >+        return -1;
> >+
> >+    if ((signed)(buf->use - len)<  0) {
> 
> I tend to write the cast as (int), not (signed), if a cast is even
> needed.  You don't catch all possible overflows, though - if
> buf->use is 2, and len is 4294967295 (aka (unsigned)-1), then you've
> proceeded to expand(!) buf->use to 3, skipping an uninitialized
> byte.  A better filter would be:
> 
> if (len > buf->use)
> 
> >+        virBufferSetError(buf, -1);
> >+        return -1;
> >+    }
> >+
> >+    buf->use -= len;
> >+    buf->content[buf->use] = '\0';
> 
> This looks correct, once you filter out invalid len first.

Agreed.

> 
> >+++ b/tests/virbuftest.c
> >@@ -123,7 +123,8 @@ static int testBufAutoIndent(const void *data ATTRIBUTE_UNUSED)
> >      virBufferAddChar(buf, '\n');
> >      virBufferEscapeShell(buf, " 11");
> >      virBufferAddChar(buf, '\n');
> >-
> >+    virBufferAsprintf(buf, "%d", 12);
> >+    virBufferTruncate(buf, 4);
> 
> That gives no change in the expected output.  I'd almost rather see:
> 
> virBufferAsprintf(buf, "%d", 123);
> virBufferTruncate(buf, 1);
> 
> as well as an update to the expected output to see output ending in "12".

The idea was to test with minimal change and hence resorted to this.

In any case, I am dropping this patch for the reason explained in another
thread.

Regards,
Bharata.




More information about the libvir-list mailing list