From 1ff35b6bb9a2702c4b0785281f22018b05e549c8 Mon Sep 17 00:00:00 2001 From: Anoop C S Date: Wed, 31 Jan 2018 22:43:21 +0530 Subject: tests: Add test case to validate free-list indexes Signed-off-by: Anoop C S Reviewed-by: Michael Adam Reviewed-by: Andreas Schneider --- tests/test_tcp_socket_overwrite.c | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tests/test_tcp_socket_overwrite.c (limited to 'tests/test_tcp_socket_overwrite.c') diff --git a/tests/test_tcp_socket_overwrite.c b/tests/test_tcp_socket_overwrite.c new file mode 100644 index 0000000..9695e33 --- /dev/null +++ b/tests/test_tcp_socket_overwrite.c @@ -0,0 +1,74 @@ +#include "torture.h" + +#include +#include +#include +#include + +static int setup(void **state) +{ + torture_setup_socket_dir(state); + + return 0; +} + +static int teardown(void **state) +{ + torture_teardown_socket_dir(state); + + return 0; +} + +static void test_tcp_socket_overwrite(void **state) +{ + struct torture_address addr_in = { + .sa_socklen = sizeof(struct sockaddr_in), + }; + + int s, dup_s, new_s, rc; + + (void) state; /* unused */ + + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + assert_int_not_equal(s, -1); + + dup_s = dup(s); + assert_int_not_equal(dup_s, -1); + + close(dup_s); + + new_s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); + assert_int_not_equal(new_s, -1); + + close(new_s); + + addr_in = (struct torture_address) { + .sa_socklen = sizeof(struct sockaddr_in), + .sa.in = (struct sockaddr_in) { + .sin_family = AF_INET, + }, + }; + + rc = inet_pton(AF_INET, "127.0.0.20", &addr_in.sa.in.sin_addr); + assert_int_equal(rc, 1); + + /* bind should fail during socklen check if old socket info + * is overwritten by new socket info */ + rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen); + assert_return_code(rc, errno); + + close(s); +} + +int main(void) { + int rc; + + const struct CMUnitTest tcp_socket_overwrite_tests[] = { + cmocka_unit_test(test_tcp_socket_overwrite), + }; + + rc = cmocka_run_group_tests(tcp_socket_overwrite_tests, + setup, teardown); + + return rc; +} -- cgit