From 7a3de841b8395df0e9d582be7fa00fcbbc8e998d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 29 Sep 2022 08:18:42 +0200 Subject: [PATCH] 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) --- src/libnm-glib-aux/nm-str-buf.h | 5 ++++- src/libnm-glib-aux/tests/test-shared-general.c | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 7d36d64a8c..cfe70b5868 100644 --- a/src/libnm-glib-aux/tests/test-shared-general.c +++ b/src/libnm-glib-aux/tests/test-shared-general.c @@ -970,6 +970,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); + } } /*****************************************************************************/