@@ -871,4 +871,107 @@ TEST_F(various_address_sockets, scoped_pathname_sockets)
871871 _metadata -> exit_code = KSFT_FAIL ;
872872}
873873
874+ TEST (datagram_sockets )
875+ {
876+ struct service_fixture connected_addr , non_connected_addr ;
877+ int server_conn_socket , server_unconn_socket ;
878+ int pipe_parent [2 ], pipe_child [2 ];
879+ int status ;
880+ char buf ;
881+ pid_t child ;
882+
883+ drop_caps (_metadata );
884+ memset (& connected_addr , 0 , sizeof (connected_addr ));
885+ set_unix_address (& connected_addr , 0 );
886+ memset (& non_connected_addr , 0 , sizeof (non_connected_addr ));
887+ set_unix_address (& non_connected_addr , 1 );
888+
889+ ASSERT_EQ (0 , pipe2 (pipe_parent , O_CLOEXEC ));
890+ ASSERT_EQ (0 , pipe2 (pipe_child , O_CLOEXEC ));
891+
892+ child = fork ();
893+ ASSERT_LE (0 , child );
894+ if (child == 0 ) {
895+ int client_conn_socket , client_unconn_socket ;
896+
897+ EXPECT_EQ (0 , close (pipe_parent [1 ]));
898+ EXPECT_EQ (0 , close (pipe_child [0 ]));
899+
900+ client_conn_socket = socket (AF_UNIX , SOCK_DGRAM , 0 );
901+ client_unconn_socket = socket (AF_UNIX , SOCK_DGRAM , 0 );
902+ ASSERT_LE (0 , client_conn_socket );
903+ ASSERT_LE (0 , client_unconn_socket );
904+
905+ /* Waits for parent to listen. */
906+ ASSERT_EQ (1 , read (pipe_parent [0 ], & buf , 1 ));
907+ ASSERT_EQ (0 ,
908+ connect (client_conn_socket , & connected_addr .unix_addr ,
909+ connected_addr .unix_addr_len ));
910+
911+ /*
912+ * Both connected and non-connected sockets can send data when
913+ * the domain is not scoped.
914+ */
915+ ASSERT_EQ (1 , send (client_conn_socket , "." , 1 , 0 ));
916+ ASSERT_EQ (1 , sendto (client_unconn_socket , "." , 1 , 0 ,
917+ & non_connected_addr .unix_addr ,
918+ non_connected_addr .unix_addr_len ));
919+ ASSERT_EQ (1 , write (pipe_child [1 ], "." , 1 ));
920+
921+ /* Scopes the domain. */
922+ create_scoped_domain (_metadata ,
923+ LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET );
924+
925+ /*
926+ * Connected socket sends data to the receiver, but the
927+ * non-connected socket must fail to send data.
928+ */
929+ ASSERT_EQ (1 , send (client_conn_socket , "." , 1 , 0 ));
930+ ASSERT_EQ (-1 , sendto (client_unconn_socket , "." , 1 , 0 ,
931+ & non_connected_addr .unix_addr ,
932+ non_connected_addr .unix_addr_len ));
933+ ASSERT_EQ (EPERM , errno );
934+ ASSERT_EQ (1 , write (pipe_child [1 ], "." , 1 ));
935+
936+ EXPECT_EQ (0 , close (client_conn_socket ));
937+ EXPECT_EQ (0 , close (client_unconn_socket ));
938+ _exit (_metadata -> exit_code );
939+ return ;
940+ }
941+ EXPECT_EQ (0 , close (pipe_parent [0 ]));
942+ EXPECT_EQ (0 , close (pipe_child [1 ]));
943+
944+ server_conn_socket = socket (AF_UNIX , SOCK_DGRAM , 0 );
945+ server_unconn_socket = socket (AF_UNIX , SOCK_DGRAM , 0 );
946+ ASSERT_LE (0 , server_conn_socket );
947+ ASSERT_LE (0 , server_unconn_socket );
948+
949+ ASSERT_EQ (0 , bind (server_conn_socket , & connected_addr .unix_addr ,
950+ connected_addr .unix_addr_len ));
951+ ASSERT_EQ (0 , bind (server_unconn_socket , & non_connected_addr .unix_addr ,
952+ non_connected_addr .unix_addr_len ));
953+ ASSERT_EQ (1 , write (pipe_parent [1 ], "." , 1 ));
954+
955+ /* Waits for child to test. */
956+ ASSERT_EQ (1 , read (pipe_child [0 ], & buf , 1 ));
957+ ASSERT_EQ (1 , recv (server_conn_socket , & buf , 1 , 0 ));
958+ ASSERT_EQ (1 , recv (server_unconn_socket , & buf , 1 , 0 ));
959+
960+ /*
961+ * Connected datagram socket will receive data, but
962+ * non-connected datagram socket does not receive data.
963+ */
964+ ASSERT_EQ (1 , read (pipe_child [0 ], & buf , 1 ));
965+ ASSERT_EQ (1 , recv (server_conn_socket , & buf , 1 , 0 ));
966+
967+ /* Waits for all tests to finish. */
968+ ASSERT_EQ (child , waitpid (child , & status , 0 ));
969+ EXPECT_EQ (0 , close (server_conn_socket ));
970+ EXPECT_EQ (0 , close (server_unconn_socket ));
971+
972+ if (WIFSIGNALED (status ) || !WIFEXITED (status ) ||
973+ WEXITSTATUS (status ) != EXIT_SUCCESS )
974+ _metadata -> exit_code = KSFT_FAIL ;
975+ }
976+
874977TEST_HARNESS_MAIN
0 commit comments