[openssh-commits] [openssh] 02/02: upstream: unit tests for sshbuf_get_nulterminated_string()
git+noreply at mindrot.org
git+noreply at mindrot.org
Fri Nov 21 12:56:41 AEDT 2025
This is an automated email from the git hooks/post-receive script.
djm pushed a commit to branch master
in repository openssh.
commit 71e8779113965d60d91ba2d15cdeeb43ecf230a7
Author: djm at openbsd.org <djm at openbsd.org>
AuthorDate: Fri Nov 21 01:29:27 2025 +0000
upstream: unit tests for sshbuf_get_nulterminated_string()
OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086
---
.../unittests/sshbuf/test_sshbuf_getput_basic.c | 117 ++++++++++++++++++++-
1 file changed, 116 insertions(+), 1 deletion(-)
diff --git a/regress/unittests/sshbuf/test_sshbuf_getput_basic.c b/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
index bfe61a877..d9ed194b0 100644
--- a/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
+++ b/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.5 2025/09/15 03:00:22 djm Exp $ */
+/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.6 2025/11/21 01:29:27 djm Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -712,4 +712,119 @@ sshbuf_getput_basic_tests(void)
sshbuf_free(p1);
free(s2);
TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* hello\0 */
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* hello\0there */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11);
+ /* short maxlen */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 1, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 4, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
+ /* minimum usable maxlen */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "hello");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* "there" remains */
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string un-terminated string");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* "there" */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string subsequent strings");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "there\0" */
+ ASSERT_INT_EQ(sshbuf_put(p1, "it is", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "it is\0" */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 12);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "there");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
+ free(s2);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "it is");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string empty buffer");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string: single nul byte");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 0, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "");
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string starts with nul");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "");
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
+ free(s2);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "hello");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
}
--
To stop receiving notification emails like this one, please contact
djm at mindrot.org.
More information about the openssh-commits
mailing list