diff options
author | Anoop C S <anoopcs@redhat.com> | 2018-01-31 22:43:21 +0530 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2018-05-02 16:31:42 +0200 |
commit | 1ff35b6bb9a2702c4b0785281f22018b05e549c8 (patch) | |
tree | cc7eac84e76e78ef1148e8e5a4ccbe6e5399ae27 | |
parent | da1fe44b27ce2dc66d795637c13bc13b2a657b79 (diff) | |
download | socket_wrapper-1ff35b6bb9a2702c4b0785281f22018b05e549c8.tar.gz socket_wrapper-1ff35b6bb9a2702c4b0785281f22018b05e549c8.tar.xz socket_wrapper-1ff35b6bb9a2702c4b0785281f22018b05e549c8.zip |
tests: Add test case to validate free-list indexes
Signed-off-by: Anoop C S <anoopcs@redhat.com>
Reviewed-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/test_tcp_socket_overwrite.c | 74 |
2 files changed, 76 insertions, 1 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 08abcad..26173bb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -42,7 +42,8 @@ set(SWRAP_TESTS test_thread_echo_tcp_connect test_thread_echo_tcp_write_read test_thread_echo_tcp_sendmsg_recvmsg - test_thread_echo_udp_send_recv) + test_thread_echo_udp_send_recv + test_tcp_socket_overwrite) if (HAVE_STRUCT_MSGHDR_MSG_CONTROL) set(SWRAP_TESTS ${SWRAP_TESTS} test_sendmsg_recvmsg_fd) 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 <cmocka.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <errno.h> + +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; +} |