@@ -784,7 +784,7 @@ void *kill_thread(void *data)
784
784
bool die = (bool )data ;
785
785
786
786
if (die ) {
787
- prctl ( PR_GET_SECCOMP , 0 , 0 , 0 , 0 );
787
+ syscall ( __NR_getpid );
788
788
return (void * )SIBLING_EXIT_FAILURE ;
789
789
}
790
790
@@ -803,11 +803,11 @@ void kill_thread_or_group(struct __test_metadata *_metadata,
803
803
{
804
804
pthread_t thread ;
805
805
void * status ;
806
- /* Kill only when calling __NR_prctl . */
806
+ /* Kill only when calling __NR_getpid . */
807
807
struct sock_filter filter_thread [] = {
808
808
BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
809
809
offsetof(struct seccomp_data , nr )),
810
- BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_prctl , 0 , 1 ),
810
+ BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getpid , 0 , 1 ),
811
811
BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_KILL_THREAD ),
812
812
BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ALLOW ),
813
813
};
@@ -819,7 +819,7 @@ void kill_thread_or_group(struct __test_metadata *_metadata,
819
819
struct sock_filter filter_process [] = {
820
820
BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
821
821
offsetof(struct seccomp_data , nr )),
822
- BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_prctl , 0 , 1 ),
822
+ BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getpid , 0 , 1 ),
823
823
BPF_STMT (BPF_RET |BPF_K , kill ),
824
824
BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ALLOW ),
825
825
};
@@ -3709,7 +3709,12 @@ TEST(user_notification_sibling_pid_ns)
3709
3709
ASSERT_GE (pid , 0 );
3710
3710
3711
3711
if (pid == 0 ) {
3712
- ASSERT_EQ (unshare (CLONE_NEWPID ), 0 );
3712
+ ASSERT_EQ (unshare (CLONE_NEWPID ), 0 ) {
3713
+ if (errno == EPERM )
3714
+ SKIP (return , "CLONE_NEWPID requires CAP_SYS_ADMIN" );
3715
+ else if (errno == EINVAL )
3716
+ SKIP (return , "CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)" );
3717
+ }
3713
3718
3714
3719
pid2 = fork ();
3715
3720
ASSERT_GE (pid2 , 0 );
@@ -3727,6 +3732,8 @@ TEST(user_notification_sibling_pid_ns)
3727
3732
ASSERT_EQ (unshare (CLONE_NEWPID ), 0 ) {
3728
3733
if (errno == EPERM )
3729
3734
SKIP (return , "CLONE_NEWPID requires CAP_SYS_ADMIN" );
3735
+ else if (errno == EINVAL )
3736
+ SKIP (return , "CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)" );
3730
3737
}
3731
3738
ASSERT_EQ (errno , 0 );
3732
3739
@@ -4037,6 +4044,16 @@ TEST(user_notification_filter_empty_threaded)
4037
4044
EXPECT_GT ((pollfd .revents & POLLHUP ) ?: 0 , 0 );
4038
4045
}
4039
4046
4047
+
4048
+ int get_next_fd (int prev_fd )
4049
+ {
4050
+ for (int i = prev_fd + 1 ; i < FD_SETSIZE ; ++ i ) {
4051
+ if (fcntl (i , F_GETFD ) == -1 )
4052
+ return i ;
4053
+ }
4054
+ _exit (EXIT_FAILURE );
4055
+ }
4056
+
4040
4057
TEST (user_notification_addfd )
4041
4058
{
4042
4059
pid_t pid ;
@@ -4053,7 +4070,7 @@ TEST(user_notification_addfd)
4053
4070
/* There may be arbitrary already-open fds at test start. */
4054
4071
memfd = memfd_create ("test" , 0 );
4055
4072
ASSERT_GE (memfd , 0 );
4056
- nextfd = memfd + 1 ;
4073
+ nextfd = get_next_fd ( memfd ) ;
4057
4074
4058
4075
ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
4059
4076
ASSERT_EQ (0 , ret ) {
@@ -4064,7 +4081,8 @@ TEST(user_notification_addfd)
4064
4081
/* Check that the basic notification machinery works */
4065
4082
listener = user_notif_syscall (__NR_getppid ,
4066
4083
SECCOMP_FILTER_FLAG_NEW_LISTENER );
4067
- ASSERT_EQ (listener , nextfd ++ );
4084
+ ASSERT_EQ (listener , nextfd );
4085
+ nextfd = get_next_fd (nextfd );
4068
4086
4069
4087
pid = fork ();
4070
4088
ASSERT_GE (pid , 0 );
@@ -4119,14 +4137,16 @@ TEST(user_notification_addfd)
4119
4137
4120
4138
/* Verify we can set an arbitrary remote fd */
4121
4139
fd = ioctl (listener , SECCOMP_IOCTL_NOTIF_ADDFD , & addfd );
4122
- EXPECT_EQ (fd , nextfd ++ );
4140
+ EXPECT_EQ (fd , nextfd );
4141
+ nextfd = get_next_fd (nextfd );
4123
4142
EXPECT_EQ (filecmp (getpid (), pid , memfd , fd ), 0 );
4124
4143
4125
4144
/* Verify we can set an arbitrary remote fd with large size */
4126
4145
memset (& big , 0x0 , sizeof (big ));
4127
4146
big .addfd = addfd ;
4128
4147
fd = ioctl (listener , SECCOMP_IOCTL_NOTIF_ADDFD_BIG , & big );
4129
- EXPECT_EQ (fd , nextfd ++ );
4148
+ EXPECT_EQ (fd , nextfd );
4149
+ nextfd = get_next_fd (nextfd );
4130
4150
4131
4151
/* Verify we can set a specific remote fd */
4132
4152
addfd .newfd = 42 ;
@@ -4164,7 +4184,8 @@ TEST(user_notification_addfd)
4164
4184
* Child has earlier "low" fds and now 42, so we expect the next
4165
4185
* lowest available fd to be assigned here.
4166
4186
*/
4167
- EXPECT_EQ (fd , nextfd ++ );
4187
+ EXPECT_EQ (fd , nextfd );
4188
+ nextfd = get_next_fd (nextfd );
4168
4189
ASSERT_EQ (filecmp (getpid (), pid , memfd , fd ), 0 );
4169
4190
4170
4191
/*
0 commit comments