1919#include "getpeername_unix_prog.skel.h"
2020#include "network_helpers.h"
2121
22+ #ifndef ENOTSUPP
23+ # define ENOTSUPP 524
24+ #endif
25+
2226#define TEST_NS "sock_addr"
2327#define TEST_IF_PREFIX "test_sock_addr"
2428#define TEST_IPV4 "127.0.0.4"
4347#define SERVUN_REWRITE_ADDRESS "bpf_cgroup_unix_test_rewrite"
4448#define SRCUN_ADDRESS "bpf_cgroup_unix_test_src"
4549
50+ #define save_errno_do (op ) ({ int __save = errno; op; errno = __save; })
51+
4652enum sock_addr_test_type {
4753 SOCK_ADDR_TEST_BIND ,
4854 SOCK_ADDR_TEST_CONNECT ,
@@ -98,6 +104,7 @@ static int run_bpf_prog(const char *prog_name, void *ctx, int ctx_size)
98104 goto err ;
99105
100106 err = topts .retval ;
107+ errno = - topts .retval ;
101108 goto out ;
102109err :
103110 err = -1 ;
@@ -221,16 +228,15 @@ int kernel_connect_to_addr(int type, const struct sockaddr_storage *addr, sockle
221228 "kernel_init_sock" ))
222229 goto err ;
223230
224- if (!ASSERT_OK (kernel_connect ((struct sockaddr * )addr , addrlen ),
225- "kernel_connect" ))
231+ if (kernel_connect ((struct sockaddr * )addr , addrlen ) < 0 )
226232 goto err ;
227233
228234 /* Test code expects a "file descriptor" on success. */
229235 err = 1 ;
230236 goto out ;
231237err :
232238 err = -1 ;
233- ASSERT_OK (kernel_close_sock (0 ), "kernel_close_sock" );
239+ save_errno_do ( ASSERT_OK (kernel_close_sock (0 ), "kernel_close_sock" ) );
234240out :
235241 return err ;
236242}
@@ -248,8 +254,7 @@ int kernel_start_server(int family, int type, const char *addr_str, __u16 port,
248254 if (make_sockaddr (family , addr_str , port , & addr , & addrlen ))
249255 goto err ;
250256
251- if (!ASSERT_OK (kernel_bind (0 , (struct sockaddr * )& addr , addrlen ),
252- "kernel_bind" ))
257+ if (kernel_bind (0 , (struct sockaddr * )& addr , addrlen ) < 0 )
253258 goto err ;
254259
255260 if (type == SOCK_STREAM ) {
@@ -262,7 +267,7 @@ int kernel_start_server(int family, int type, const char *addr_str, __u16 port,
262267 goto out ;
263268err :
264269 err = -1 ;
265- ASSERT_OK (kernel_close_sock (0 ), "kernel_close_sock" );
270+ save_errno_do ( ASSERT_OK (kernel_close_sock (0 ), "kernel_close_sock" ) );
266271out :
267272 return err ;
268273}
@@ -1066,7 +1071,7 @@ static void unload_sock_addr_kern(void)
10661071 sock_addr_kern__destroy (skel );
10671072}
10681073
1069- static void test_bind (struct sock_addr_test * test )
1074+ static int test_bind (struct sock_addr_test * test )
10701075{
10711076 struct sockaddr_storage expected_addr ;
10721077 socklen_t expected_addr_len = sizeof (struct sockaddr_storage );
@@ -1075,8 +1080,10 @@ static void test_bind(struct sock_addr_test *test)
10751080 serv = test -> ops -> start_server (test -> socket_family , test -> socket_type ,
10761081 test -> requested_addr ,
10771082 test -> requested_port , 0 );
1078- if (!ASSERT_GE (serv , 0 , "start_server" ))
1079- goto cleanup ;
1083+ if (serv < 0 ) {
1084+ err = errno ;
1085+ goto err ;
1086+ }
10801087
10811088 err = make_sockaddr (test -> socket_family ,
10821089 test -> expected_addr , test -> expected_port ,
@@ -1095,13 +1102,17 @@ static void test_bind(struct sock_addr_test *test)
10951102 goto cleanup ;
10961103
10971104cleanup :
1105+ err = 0 ;
1106+ err :
10981107 if (client != -1 )
10991108 close (client );
11001109 if (serv != -1 )
11011110 test -> ops -> close (serv );
1111+
1112+ return err ;
11021113}
11031114
1104- static void test_connect (struct sock_addr_test * test )
1115+ static int test_connect (struct sock_addr_test * test )
11051116{
11061117 struct sockaddr_storage addr , expected_addr , expected_src_addr ;
11071118 socklen_t addr_len = sizeof (struct sockaddr_storage ),
@@ -1121,8 +1132,10 @@ static void test_connect(struct sock_addr_test *test)
11211132
11221133 client = test -> ops -> connect_to_addr (test -> socket_type , & addr , addr_len ,
11231134 NULL );
1124- if (!ASSERT_GE (client , 0 , "connect_to_addr" ))
1125- goto cleanup ;
1135+ if (client < 0 ) {
1136+ err = errno ;
1137+ goto err ;
1138+ }
11261139
11271140 err = make_sockaddr (test -> socket_family , test -> expected_addr , test -> expected_port ,
11281141 & expected_addr , & expected_addr_len );
@@ -1149,13 +1162,17 @@ static void test_connect(struct sock_addr_test *test)
11491162 goto cleanup ;
11501163 }
11511164cleanup :
1165+ err = 0 ;
1166+ err :
11521167 if (client != -1 )
11531168 test -> ops -> close (client );
11541169 if (serv != -1 )
11551170 close (serv );
1171+
1172+ return err ;
11561173}
11571174
1158- static void test_xmsg (struct sock_addr_test * test )
1175+ static int test_xmsg (struct sock_addr_test * test )
11591176{
11601177 struct sockaddr_storage addr , src_addr ;
11611178 socklen_t addr_len = sizeof (struct sockaddr_storage ),
@@ -1196,6 +1213,11 @@ static void test_xmsg(struct sock_addr_test *test)
11961213 if (test -> socket_type == SOCK_DGRAM ) {
11971214 err = test -> ops -> sendmsg (client , (struct sockaddr * )& addr ,
11981215 addr_len , & data , sizeof (data ));
1216+ if (err < 0 ) {
1217+ err = errno ;
1218+ goto err ;
1219+ }
1220+
11991221 if (!ASSERT_EQ (err , sizeof (data ), "sendmsg" ))
12001222 goto cleanup ;
12011223 } else {
@@ -1245,13 +1267,17 @@ static void test_xmsg(struct sock_addr_test *test)
12451267 }
12461268
12471269cleanup :
1270+ err = 0 ;
1271+ err :
12481272 if (client != -1 )
12491273 test -> ops -> close (client );
12501274 if (serv != -1 )
12511275 close (serv );
1276+
1277+ return err ;
12521278}
12531279
1254- static void test_getsockname (struct sock_addr_test * test )
1280+ static int test_getsockname (struct sock_addr_test * test )
12551281{
12561282 struct sockaddr_storage expected_addr ;
12571283 socklen_t expected_addr_len = sizeof (struct sockaddr_storage );
@@ -1275,9 +1301,11 @@ static void test_getsockname(struct sock_addr_test *test)
12751301cleanup :
12761302 if (serv != -1 )
12771303 test -> ops -> close (serv );
1304+
1305+ return 0 ;
12781306}
12791307
1280- static void test_getpeername (struct sock_addr_test * test )
1308+ static int test_getpeername (struct sock_addr_test * test )
12811309{
12821310 struct sockaddr_storage addr , expected_addr ;
12831311 socklen_t addr_len = sizeof (struct sockaddr_storage ),
@@ -1314,6 +1342,8 @@ static void test_getpeername(struct sock_addr_test *test)
13141342 test -> ops -> close (client );
13151343 if (serv != -1 )
13161344 close (serv );
1345+
1346+ return 0 ;
13171347}
13181348
13191349static int setup_test_env (struct nstoken * * tok )
@@ -1369,6 +1399,7 @@ void test_sock_addr(void)
13691399
13701400 for (size_t i = 0 ; i < ARRAY_SIZE (tests ); ++ i ) {
13711401 struct sock_addr_test * test = & tests [i ];
1402+ int err ;
13721403
13731404 if (!test__start_subtest (test -> name ))
13741405 continue ;
@@ -1385,26 +1416,33 @@ void test_sock_addr(void)
13851416 * the future.
13861417 */
13871418 case SOCK_ADDR_TEST_BIND :
1388- test_bind (test );
1419+ err = test_bind (test );
13891420 break ;
13901421 case SOCK_ADDR_TEST_CONNECT :
1391- test_connect (test );
1422+ err = test_connect (test );
13921423 break ;
13931424 case SOCK_ADDR_TEST_SENDMSG :
13941425 case SOCK_ADDR_TEST_RECVMSG :
1395- test_xmsg (test );
1426+ err = test_xmsg (test );
13961427 break ;
13971428 case SOCK_ADDR_TEST_GETSOCKNAME :
1398- test_getsockname (test );
1429+ err = test_getsockname (test );
13991430 break ;
14001431 case SOCK_ADDR_TEST_GETPEERNAME :
1401- test_getpeername (test );
1432+ err = test_getpeername (test );
14021433 break ;
14031434 default :
14041435 ASSERT_TRUE (false, "Unknown sock addr test type" );
14051436 break ;
14061437 }
14071438
1439+ if (test -> expected_result == SYSCALL_EPERM )
1440+ ASSERT_EQ (err , EPERM , "socket operation returns EPERM" );
1441+ else if (test -> expected_result == SYSCALL_ENOTSUPP )
1442+ ASSERT_EQ (err , ENOTSUPP , "socket operation returns ENOTSUPP" );
1443+ else if (test -> expected_result == SUCCESS )
1444+ ASSERT_OK (err , "socket operation succeeds" );
1445+
14081446 test -> destroyfn (skel );
14091447 }
14101448
0 commit comments