mirror of
https://github.com/openssh/openssh-portable.git
synced 2026-01-12 00:04:08 +08:00
upstream: unit tests for sshbuf_get_nulterminated_string()
OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086
This commit is contained in:
committed by
Damien Miller
parent
dec6334aaf
commit
71e8779113
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user