[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