This is an automated email from the git hooks/post-receive script.

guillem pushed a commit to branch main
in repository dpkg.

View the commit online:
https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=cae07d61c3659836c7f37e52e3bf9297951849fd

commit cae07d61c3659836c7f37e52e3bf9297951849fd
Author: Guillem Jover <[email protected]>
AuthorDate: Wed Jul 12 04:41:33 2023 +0200

    libdpkg: Always NUL terminate varbufs
    
    This guarantees the varbufs returned by functions are always printable
    and prepared to be handled by C string functions.
---
 lib/dpkg/t/t-varbuf.c | 14 --------------
 lib/dpkg/varbuf.c     | 22 ++++++++++++++++------
 2 files changed, 16 insertions(+), 20 deletions(-)

diff --git a/lib/dpkg/t/t-varbuf.c b/lib/dpkg/t/t-varbuf.c
index b259a197c..1271f8b4d 100644
--- a/lib/dpkg/t/t-varbuf.c
+++ b/lib/dpkg/t/t-varbuf.c
@@ -331,34 +331,26 @@ test_varbuf_add_dir(void)
        varbuf_init(&vb, 10);
 
        varbuf_add_dir(&vb, "");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/");
        varbuf_add_dir(&vb, "");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/");
        varbuf_add_dir(&vb, "aa");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/aa/");
        varbuf_add_dir(&vb, "");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/aa/");
 
        varbuf_reset(&vb);
 
        varbuf_add_dir(&vb, "/foo/bar");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/foo/bar/");
 
        varbuf_reset(&vb);
 
        varbuf_add_dir(&vb, "/foo/bar/");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/foo/bar/");
        varbuf_add_dir(&vb, "quux");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/foo/bar/quux/");
        varbuf_add_dir(&vb, "zoo");
-       varbuf_end_str(&vb);
        test_str(vb.buf, ==, "/foo/bar/quux/zoo/");
 
        varbuf_destroy(&vb);
@@ -378,7 +370,6 @@ test_varbuf_end_str(void)
 
        varbuf_trunc(&vb, 10);
 
-       varbuf_end_str(&vb);
        test_pass(vb.used == 10);
        test_pass(vb.size >= vb.used + 1);
        test_pass(vb.buf[10] == '\0');
@@ -478,18 +469,15 @@ test_varbuf_snapshot(void)
        test_str(varbuf_rollback_start(&vbs), ==, "");
 
        varbuf_add_buf(&vb, "1234567890", 10);
-       varbuf_end_str(&vb);
        test_pass(vb.used == 10);
        test_pass(varbuf_rollback_len(&vbs) == 10);
        test_str(varbuf_rollback_start(&vbs), ==, "1234567890");
        varbuf_rollback(&vbs);
-       varbuf_end_str(&vb);
        test_pass(vb.used == 0);
        test_pass(varbuf_rollback_len(&vbs) == 0);
        test_str(varbuf_rollback_start(&vbs), ==, "");
 
        varbuf_add_buf(&vb, "1234567890", 10);
-       varbuf_end_str(&vb);
        test_pass(vb.used == 10);
        test_pass(varbuf_rollback_len(&vbs) == 10);
        test_str(varbuf_rollback_start(&vbs), ==, "1234567890");
@@ -499,12 +487,10 @@ test_varbuf_snapshot(void)
        test_str(varbuf_rollback_start(&vbs), ==, "");
 
        varbuf_add_buf(&vb, "1234567890", 10);
-       varbuf_end_str(&vb);
        test_pass(vb.used == 20);
        test_pass(varbuf_rollback_len(&vbs) == 10);
        test_str(varbuf_rollback_start(&vbs), ==, "1234567890");
        varbuf_rollback(&vbs);
-       varbuf_end_str(&vb);
        test_pass(vb.used == 10);
        test_pass(varbuf_rollback_len(&vbs) == 0);
        test_str(varbuf_rollback_start(&vbs), ==, "");
diff --git a/lib/dpkg/varbuf.c b/lib/dpkg/varbuf.c
index e314692ac..c4f6d1474 100644
--- a/lib/dpkg/varbuf.c
+++ b/lib/dpkg/varbuf.c
@@ -46,10 +46,12 @@ varbuf_init(struct varbuf *v, size_t size)
 {
        v->used = 0;
        v->size = size;
-       if (size)
+       if (size) {
                v->buf = m_malloc(size);
-       else
+               v->buf[0] = '\0';
+       } else {
                v->buf = NULL;
+       }
 }
 
 void
@@ -83,12 +85,16 @@ varbuf_trunc(struct varbuf *v, size_t used_size)
                internerr("varbuf new_used(%zu) > size(%zu)", used_size, 
v->size);
 
        v->used = used_size;
+       if (v->buf)
+               v->buf[v->used] = '\0';
 }
 
 void
 varbuf_reset(struct varbuf *v)
 {
        v->used = 0;
+       if (v->buf)
+               v->buf[0] = '\0';
 }
 
 const char *
@@ -119,16 +125,18 @@ varbuf_set_varbuf(struct varbuf *v, struct varbuf *other)
 void
 varbuf_add_varbuf(struct varbuf *v, const struct varbuf *other)
 {
-       varbuf_grow(v, other->used);
+       varbuf_grow(v, other->used + 1);
        memcpy(v->buf + v->used, other->buf, other->used);
        v->used += other->used;
+       v->buf[v->used] = '\0';
 }
 
 void
 varbuf_add_char(struct varbuf *v, int c)
 {
-       varbuf_grow(v, 1);
+       varbuf_grow(v, 2);
        v->buf[v->used++] = c;
+       v->buf[v->used] = '\0';
 }
 
 void
@@ -136,9 +144,10 @@ varbuf_dup_char(struct varbuf *v, int c, size_t n)
 {
        if (n == 0)
                return;
-       varbuf_grow(v, n);
+       varbuf_grow(v, n + 1);
        memset(v->buf + v->used, c, n);
        v->used += n;
+       v->buf[v->used] = '\0';
 }
 
 void
@@ -164,9 +173,10 @@ varbuf_add_buf(struct varbuf *v, const void *s, size_t 
size)
 {
        if (size == 0)
                return;
-       varbuf_grow(v, size);
+       varbuf_grow(v, size + 1);
        memcpy(v->buf + v->used, s, size);
        v->used += size;
+       v->buf[v->used] = '\0';
 }
 
 void

-- 
Dpkg.Org's dpkg

Reply via email to