]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: unit tests for sshbuf_get_nulterminated_string()
authordjm@openbsd.org <djm@openbsd.org>
Fri, 21 Nov 2025 01:29:27 +0000 (01:29 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 21 Nov 2025 01:56:34 +0000 (12:56 +1100)
OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086

regress/unittests/sshbuf/test_sshbuf_getput_basic.c

index bfe61a8773bc06b19d3a523ccf6e7b379a273054..d9ed194b063f11685e422be81a8c3dc9bf7f7f15 100644 (file)
@@ -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();
 }