Skip to content

Commit 1037af7

Browse files
committed
Add an if (!s) return -WOLFIP_EINVAL; guard to wolfIP_sock_socket so a NULL
stack pointer no longer segfaults inside tcp_new_socket/udp_new_socket/icmp_new_socket/raw_new_socket/packet_new_socket, with test_regression_sock_socket_null_wolfip_returns_einval pinning the contract.
1 parent 2d6edbb commit 1037af7

3 files changed

Lines changed: 20 additions & 0 deletions

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ Suite *wolf_suite(void)
146146
tcase_add_test(tc_utils, test_filter_socket_event_proto_variants);
147147
tcase_add_test(tc_utils, test_filter_setters_and_get_mask);
148148
tcase_add_test(tc_utils, test_sock_socket_errors);
149+
tcase_add_test(tc_utils, test_regression_sock_socket_null_wolfip_returns_einval);
149150
tcase_add_test(tc_utils, test_sock_socket_udp_protocol_zero);
150151
tcase_add_test(tc_utils, test_sock_socket_full_tables);
151152
tcase_add_test(tc_utils, test_filter_mask_for_proto_variants);

src/test/unit/unit_tests_api.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,23 @@ START_TEST(test_sock_socket_errors)
465465
ck_assert_int_eq(wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_TCP), -1);
466466
}
467467
END_TEST
468+
469+
START_TEST(test_regression_sock_socket_null_wolfip_returns_einval)
470+
{
471+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_INET, IPSTACK_SOCK_STREAM, WI_IPPROTO_TCP),
472+
-WOLFIP_EINVAL);
473+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP),
474+
-WOLFIP_EINVAL);
475+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_INET, IPSTACK_SOCK_DGRAM, 0),
476+
-WOLFIP_EINVAL);
477+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_ICMP),
478+
-WOLFIP_EINVAL);
479+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP),
480+
-WOLFIP_EINVAL);
481+
ck_assert_int_eq(wolfIP_sock_socket(NULL, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP)),
482+
-WOLFIP_EINVAL);
483+
}
484+
END_TEST
468485
START_TEST(test_udp_sendto_and_recvfrom)
469486
{
470487
struct wolfIP s;

src/wolfip.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5291,6 +5291,8 @@ int wolfIP_sock_socket(struct wolfIP *s, int domain, int type, int protocol)
52915291
#if WOLFIP_RAWSOCKETS || WOLFIP_PACKET_SOCKETS
52925292
int base_type = type;
52935293
#endif
5294+
if (!s)
5295+
return -WOLFIP_EINVAL;
52945296
if (domain != AF_INET)
52955297
goto packet_try;
52965298
if (type == IPSTACK_SOCK_STREAM) {

0 commit comments

Comments
 (0)