From: djm@openbsd.org Date: Fri, 21 Nov 2025 01:29:27 +0000 (+0000) Subject: upstream: unit tests for sshbuf_get_nulterminated_string() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71e8779113965d60d91ba2d15cdeeb43ecf230a7;p=thirdparty%2Fopenssh-portable.git upstream: unit tests for sshbuf_get_nulterminated_string() OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086 --- 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(); }