@@ -31,7 +31,7 @@ int main(int argc, char **argv)
31
31
static const int NOPTS = sizeof (vname ) / sizeof (* vname );
32
32
#undef OPT
33
33
34
- int sock , ret = 0 , val [NOPTS ], rval , i ;
34
+ int sock , usock , sk , ret = 0 , val [NOPTS ], rval , i ;
35
35
socklen_t len = sizeof (int );
36
36
37
37
test_init (argc , argv );
@@ -42,22 +42,29 @@ int main(int argc, char **argv)
42
42
return 1 ;
43
43
}
44
44
45
+ usock = socket (AF_UNIX , SOCK_STREAM , 0 );
46
+ if (usock < 0 ) {
47
+ pr_perror ("can't create unix socket" );
48
+ return 1 ;
49
+ }
50
+
45
51
for (i = 0 ; i < NOPTS ; i ++ ) {
46
- ret = getsockopt (sock , SOL_SOCKET , vname [i ].opt , & val [i ], & len );
52
+ sk = vname [i ].opt == SO_PASSCRED || vname [i ].opt == SO_PASSSEC ? usock : sock ;
53
+ ret = getsockopt (sk , SOL_SOCKET , vname [i ].opt , & val [i ], & len );
47
54
if (ret ) {
48
55
pr_perror ("can't get %s" , vname [i ].name );
49
56
return 1 ;
50
57
}
51
58
52
59
val [i ]++ ;
53
60
54
- ret = setsockopt (sock , SOL_SOCKET , vname [i ].opt , & val [i ], len );
61
+ ret = setsockopt (sk , SOL_SOCKET , vname [i ].opt , & val [i ], len );
55
62
if (ret ) {
56
63
pr_perror ("can't set %s = %d" , vname [i ].name , val [i ]);
57
64
return 1 ;
58
65
}
59
66
60
- ret = getsockopt (sock , SOL_SOCKET , vname [i ].opt , & rval , & len );
67
+ ret = getsockopt (sk , SOL_SOCKET , vname [i ].opt , & rval , & len );
61
68
if (ret ) {
62
69
pr_perror ("can't re-get %s" , vname [i ].name );
63
70
return 1 ;
@@ -78,28 +85,21 @@ int main(int argc, char **argv)
78
85
test_waitsig ();
79
86
80
87
for (i = 0 ; i < NOPTS ; i ++ ) {
81
- ret = getsockopt (sock , SOL_SOCKET , vname [i ].opt , & rval , & len );
88
+ sk = vname [i ].opt == SO_PASSCRED || vname [i ].opt == SO_PASSSEC ? usock : sock ;
89
+ ret = getsockopt (sk , SOL_SOCKET , vname [i ].opt , & rval , & len );
82
90
if (ret ) {
83
91
pr_perror ("can't verify %s" , vname [i ].name );
84
92
return 1 ;
85
93
}
86
- /*
87
- * for kernel version >= 6.16.0 Restrict
88
- * SO_PASS{CRED,PIDFD,SEC} to AF_{UNIX,NETLINK,BLUETOOTH}
89
- */
90
- if (val [i ] != rval ) {
91
- if (vname [i ].opt == SO_PASSCRED || vname [i ].opt == SO_PASSSEC ) {
92
- continue ;
93
- }
94
94
95
- errno = 0 ;
96
- fail ("%s changed: %d -> %d" , vname [i ].name , val [i ], rval );
95
+ if ( rval != val [ i ]) {
96
+ pr_err ("%s changed: %d -> %d" , vname [i ].name , val [i ], rval );
97
97
return 1 ;
98
98
}
99
99
}
100
100
101
101
pass ();
102
102
close (sock );
103
-
103
+ close ( usock );
104
104
return 0 ;
105
105
}
0 commit comments