@@ -446,8 +446,73 @@ void test_v4_accept_timeout(void)
446
446
k_sleep (TCP_TEARDOWN_TIMEOUT );
447
447
}
448
448
449
+ #ifdef CONFIG_USERSPACE
450
+ #define CHILD_STACK_SZ (2048 + CONFIG_TEST_EXTRA_STACKSIZE)
451
+ struct k_thread child_thread ;
452
+ K_THREAD_STACK_DEFINE (child_stack , CHILD_STACK_SZ );
453
+ ZTEST_BMEM volatile int result ;
454
+
455
+ static void child_entry (void * p1 , void * p2 , void * p3 )
456
+ {
457
+ int sock = (int )p1 ;
458
+
459
+ result = close (sock );
460
+ }
461
+
462
+ static void spawn_child (int sock )
463
+ {
464
+ k_thread_create (& child_thread , child_stack ,
465
+ K_THREAD_STACK_SIZEOF (child_stack ), child_entry ,
466
+ (void * )sock , NULL , NULL , 0 , K_USER ,
467
+ K_FOREVER );
468
+ }
469
+ #endif
470
+
471
+ void test_socket_permission (void )
472
+ {
473
+ #ifdef CONFIG_USERSPACE
474
+ int sock ;
475
+ struct sockaddr_in saddr ;
476
+ struct net_context * ctx ;
477
+
478
+ prepare_sock_tcp_v4 (CONFIG_NET_CONFIG_MY_IPV4_ADDR , ANY_PORT ,
479
+ & sock , & saddr );
480
+
481
+ ctx = zsock_get_context_object (sock );
482
+ zassert_not_null (ctx , "zsock_get_context_object() failed" );
483
+
484
+ /* Spawn a child thread which doesn't inherit our permissions,
485
+ * it will try to perform a socket operation and fail due to lack
486
+ * of permissions on it.
487
+ */
488
+ spawn_child (sock );
489
+ k_thread_start (& child_thread );
490
+ k_thread_join (& child_thread , K_FOREVER );
491
+
492
+ zassert_not_equal (result , 0 , "child succeeded with no permission" );
493
+
494
+ /* Now spawn the same child thread again, but this time we grant
495
+ * permission on the net_context before we start it, and the
496
+ * child should now succeed.
497
+ */
498
+ spawn_child (sock );
499
+ k_object_access_grant (ctx , & child_thread );
500
+ k_thread_start (& child_thread );
501
+ k_thread_join (& child_thread , K_FOREVER );
502
+
503
+ zassert_equal (result , 0 , "child failed with permissions" );
504
+ #else
505
+ ztest_test_skip ();
506
+ #endif /* CONFIG_USERSPACE */
507
+ }
508
+
449
509
void test_main (void )
450
510
{
511
+ #ifdef CONFIG_USERSPACE
512
+ /* ztest thread inherit permissions from main */
513
+ k_thread_access_grant (k_current_get (), & child_thread , child_stack );
514
+ #endif
515
+
451
516
ztest_test_suite (
452
517
socket_tcp ,
453
518
ztest_user_unit_test (test_v4_send_recv ),
@@ -457,7 +522,9 @@ void test_main(void)
457
522
ztest_user_unit_test (test_v4_sendto_recvfrom_null_dest ),
458
523
ztest_user_unit_test (test_v6_sendto_recvfrom_null_dest ),
459
524
ztest_unit_test (test_open_close_immediately ),
460
- ztest_user_unit_test (test_v4_accept_timeout ));
525
+ ztest_user_unit_test (test_v4_accept_timeout ),
526
+ ztest_user_unit_test (test_socket_permission )
527
+ );
461
528
462
529
ztest_run_test_suite (socket_tcp );
463
530
}
0 commit comments