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

