Skip to content

Commit a2f0a9e

Browse files
jukkarcarlescufi
authored andcommitted
net: sockets: Fix sendmsg() user mode param checks for aux data
If we are calling sendmsg() without any aux data, then msg_controllen is 0 and msg_control is NULL. Check these allowed values properly. Signed-off-by: Jukka Rissanen <[email protected]>
1 parent d3dde1a commit a2f0a9e

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

subsys/net/lib/sockets/sockets.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -652,11 +652,13 @@ static inline ssize_t z_vrfy_zsock_sendmsg(int sock,
652652
}
653653
}
654654

655-
msg_copy.msg_control = z_user_alloc_from_copy(msg->msg_control,
656-
msg->msg_controllen);
657-
if (!msg_copy.msg_control) {
658-
errno = ENOMEM;
659-
goto fail;
655+
if (msg->msg_controllen > 0) {
656+
msg_copy.msg_control = z_user_alloc_from_copy(msg->msg_control,
657+
msg->msg_controllen);
658+
if (!msg_copy.msg_control) {
659+
errno = ENOMEM;
660+
goto fail;
661+
}
660662
}
661663

662664
ret = z_impl_zsock_sendmsg(sock, (const struct msghdr *)&msg_copy,

tests/net/socket/udp/src/main.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,54 @@ void test_v4_sendmsg_recvfrom(void)
470470
zassert_equal(rv, 0, "close failed");
471471
}
472472

473+
void test_v4_sendmsg_recvfrom_no_aux_data(void)
474+
{
475+
int rv;
476+
int client_sock;
477+
int server_sock;
478+
struct sockaddr_in client_addr;
479+
struct sockaddr_in server_addr;
480+
struct msghdr msg;
481+
struct iovec io_vector[1];
482+
483+
prepare_sock_udp_v4(CONFIG_NET_CONFIG_MY_IPV4_ADDR, ANY_PORT,
484+
&client_sock, &client_addr);
485+
prepare_sock_udp_v4(CONFIG_NET_CONFIG_MY_IPV4_ADDR, SERVER_PORT,
486+
&server_sock, &server_addr);
487+
488+
rv = bind(server_sock,
489+
(struct sockaddr *)&server_addr,
490+
sizeof(server_addr));
491+
zassert_equal(rv, 0, "server bind failed");
492+
493+
rv = bind(client_sock,
494+
(struct sockaddr *)&client_addr,
495+
sizeof(client_addr));
496+
zassert_equal(rv, 0, "client bind failed");
497+
498+
io_vector[0].iov_base = TEST_STR_SMALL;
499+
io_vector[0].iov_len = strlen(TEST_STR_SMALL);
500+
501+
memset(&msg, 0, sizeof(msg));
502+
msg.msg_iov = io_vector;
503+
msg.msg_iovlen = 1;
504+
msg.msg_name = &server_addr;
505+
msg.msg_namelen = sizeof(server_addr);
506+
507+
comm_sendmsg_recvfrom(client_sock,
508+
(struct sockaddr *)&client_addr,
509+
sizeof(client_addr),
510+
&msg,
511+
server_sock,
512+
(struct sockaddr *)&server_addr,
513+
sizeof(server_addr));
514+
515+
rv = close(client_sock);
516+
zassert_equal(rv, 0, "close failed");
517+
rv = close(server_sock);
518+
zassert_equal(rv, 0, "close failed");
519+
}
520+
473521
void test_v6_sendmsg_recvfrom(void)
474522
{
475523
int rv;
@@ -920,6 +968,8 @@ void test_main(void)
920968
ztest_unit_test(test_so_txtime),
921969
ztest_unit_test(test_v4_sendmsg_recvfrom),
922970
ztest_user_unit_test(test_v4_sendmsg_recvfrom),
971+
ztest_unit_test(test_v4_sendmsg_recvfrom_no_aux_data),
972+
ztest_user_unit_test(test_v4_sendmsg_recvfrom_no_aux_data),
923973
ztest_unit_test(test_v6_sendmsg_recvfrom),
924974
ztest_user_unit_test(test_v6_sendmsg_recvfrom),
925975
ztest_unit_test(test_v4_sendmsg_recvfrom_connected),

0 commit comments

Comments
 (0)