Skip to content

Commit 71e8779

Browse files
committed
upstream: unit tests for sshbuf_get_nulterminated_string()
OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086
1 parent dec6334 commit 71e8779

File tree

1 file changed

+116
-1
lines changed

1 file changed

+116
-1
lines changed

regress/unittests/sshbuf/test_sshbuf_getput_basic.c

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.5 2025/09/15 03:00:22 djm Exp $ */
1+
/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.6 2025/11/21 01:29:27 djm Exp $ */
22
/*
33
* Regress test for sshbuf.h buffer API
44
*
@@ -712,4 +712,119 @@ sshbuf_getput_basic_tests(void)
712712
sshbuf_free(p1);
713713
free(s2);
714714
TEST_DONE();
715+
716+
TEST_START("sshbuf_get_nulterminated_string");
717+
p1 = sshbuf_new();
718+
ASSERT_PTR_NE(p1, NULL);
719+
ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
720+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* hello\0 */
721+
ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* hello\0there */
722+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11);
723+
/* short maxlen */
724+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 1, &s2, &s),
725+
SSH_ERR_INVALID_FORMAT);
726+
ASSERT_PTR_EQ(s2, NULL);
727+
ASSERT_SIZE_T_EQ(s, 0);
728+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
729+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 4, &s2, &s),
730+
SSH_ERR_INVALID_FORMAT);
731+
ASSERT_PTR_EQ(s2, NULL);
732+
ASSERT_SIZE_T_EQ(s, 0);
733+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
734+
/* minimum usable maxlen */
735+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s), 0);
736+
ASSERT_STRING_EQ(s2, "hello");
737+
ASSERT_SIZE_T_EQ(s, 5);
738+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* "there" remains */
739+
free(s2);
740+
sshbuf_free(p1);
741+
TEST_DONE();
742+
743+
TEST_START("sshbuf_get_nulterminated_string un-terminated string");
744+
p1 = sshbuf_new();
745+
ASSERT_PTR_NE(p1, NULL);
746+
ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* "there" */
747+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
748+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s),
749+
SSH_ERR_INVALID_FORMAT);
750+
ASSERT_PTR_EQ(s2, NULL);
751+
ASSERT_SIZE_T_EQ(s, 0);
752+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
753+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s),
754+
SSH_ERR_MESSAGE_INCOMPLETE);
755+
ASSERT_PTR_EQ(s2, NULL);
756+
ASSERT_SIZE_T_EQ(s, 0);
757+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
758+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
759+
SSH_ERR_MESSAGE_INCOMPLETE);
760+
ASSERT_PTR_EQ(s2, NULL);
761+
ASSERT_SIZE_T_EQ(s, 0);
762+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
763+
sshbuf_free(p1);
764+
TEST_DONE();
765+
766+
TEST_START("sshbuf_get_nulterminated_string subsequent strings");
767+
p1 = sshbuf_new();
768+
ASSERT_PTR_NE(p1, NULL);
769+
ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0);
770+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "there\0" */
771+
ASSERT_INT_EQ(sshbuf_put(p1, "it is", 5), 0);
772+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "it is\0" */
773+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 12);
774+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s), 0);
775+
ASSERT_STRING_EQ(s2, "there");
776+
ASSERT_SIZE_T_EQ(s, 5);
777+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
778+
free(s2);
779+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
780+
ASSERT_STRING_EQ(s2, "it is");
781+
ASSERT_SIZE_T_EQ(s, 5);
782+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
783+
free(s2);
784+
sshbuf_free(p1);
785+
TEST_DONE();
786+
787+
TEST_START("sshbuf_get_nulterminated_string empty buffer");
788+
p1 = sshbuf_new();
789+
ASSERT_PTR_NE(p1, NULL);
790+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
791+
SSH_ERR_MESSAGE_INCOMPLETE);
792+
ASSERT_PTR_EQ(s2, NULL);
793+
ASSERT_SIZE_T_EQ(s, 0);
794+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
795+
sshbuf_free(p1);
796+
TEST_DONE();
797+
798+
TEST_START("sshbuf_get_nulterminated_string: single nul byte");
799+
p1 = sshbuf_new();
800+
ASSERT_PTR_NE(p1, NULL);
801+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
802+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
803+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 0, &s2, &s), 0);
804+
ASSERT_STRING_EQ(s2, "");
805+
ASSERT_SIZE_T_EQ(s, 0);
806+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
807+
free(s2);
808+
sshbuf_free(p1);
809+
TEST_DONE();
810+
811+
TEST_START("sshbuf_get_nulterminated_string starts with nul");
812+
p1 = sshbuf_new();
813+
ASSERT_PTR_NE(p1, NULL);
814+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
815+
ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
816+
ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
817+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7);
818+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
819+
ASSERT_STRING_EQ(s2, "");
820+
ASSERT_SIZE_T_EQ(s, 0);
821+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
822+
free(s2);
823+
ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
824+
ASSERT_STRING_EQ(s2, "hello");
825+
ASSERT_SIZE_T_EQ(s, 5);
826+
ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
827+
free(s2);
828+
sshbuf_free(p1);
829+
TEST_DONE();
715830
}

0 commit comments

Comments
 (0)