summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-09-29 08:18:42 +0200
committerThomas Haller <thaller@redhat.com>2022-09-29 15:49:11 +0200
commit51b9f0ad4c7d620e4bdee922362f1d14e36b42d2 (patch)
tree8212646a04a39e536e54f9cc1da7631e2b371893
parentfed6e78d0599726a1b63c54886c028ec7510fa7b (diff)
glib-aux: fix nm_str_buf_finalize() for cloning buffer
NMStrBuf can also contains NUL characters. We thus cannot use g_strndup(), which uses strncpy() and truncates at the first NUL. Fixes: 13d25f9d0b2f ('glib-aux: add support for starting with stack-allocated buffer in NMStrBuf') (cherry picked from commit 520411623d874803c18c4f29d13eeea7d5d5a6ac) (cherry picked from commit 7a3de841b8395df0e9d582be7fa00fcbbc8e998d)
-rw-r--r--src/libnm-glib-aux/nm-str-buf.h5
-rw-r--r--src/libnm-glib-aux/tests/test-shared-general.c10
2 files changed, 14 insertions, 1 deletions
diff --git a/src/libnm-glib-aux/nm-str-buf.h b/src/libnm-glib-aux/nm-str-buf.h
index 8d68c1eee3..e8b51208a9 100644
--- a/src/libnm-glib-aux/nm-str-buf.h
+++ b/src/libnm-glib-aux/nm-str-buf.h
@@ -530,7 +530,10 @@ nm_str_buf_finalize(NMStrBuf *strbuf, gsize *out_len)
char *str = g_steal_pointer(&strbuf->_priv_str);
char *result;
- result = g_strndup(str, strbuf->_priv_len);
+ result = g_new(char, strbuf->_priv_len + 1u);
+ memcpy(result, str, strbuf->_priv_len);
+ result[strbuf->_priv_len] = '\0';
+
if (strbuf->_priv_do_bzero_mem)
nm_explicit_bzero(str, strbuf->_priv_len);
return result;
diff --git a/src/libnm-glib-aux/tests/test-shared-general.c b/src/libnm-glib-aux/tests/test-shared-general.c
index 225049f1bb..8fb9b7e022 100644
--- a/src/libnm-glib-aux/tests/test-shared-general.c
+++ b/src/libnm-glib-aux/tests/test-shared-general.c
@@ -969,6 +969,16 @@ test_nm_str_buf(void)
} else
g_assert(stack_buf != nm_str_buf_get_str(&strbuf));
}
+
+ {
+ nm_auto_str_buf NMStrBuf s1 = NM_STR_BUF_INIT_A(10, nmtst_get_rand_bool());
+ gs_free char *str = NULL;
+ gsize l;
+
+ nm_str_buf_append_len(&s1, "a\0b", 3);
+ str = nm_str_buf_finalize(&s1, &l);
+ g_assert_cmpmem(str, l + 1, "a\0b", 4);
+ }
}
/*****************************************************************************/