Skip to content

Commit 2b168ed

Browse files
author
Dong Sunchao
committed
zdtm/static/sock_opts00: use unix socket to test SO_PASSCRED and SO_PASSSEC
Add a Unix socket to test if SO_PASSCRED and SO_PASSSEC work Fixes: #2705 Signed-off-by: Dong Sunchao <[email protected]> fix sock_opts00.c
1 parent 8402f8d commit 2b168ed

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

test/zdtm/static/sock_opts00.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ int main(int argc, char **argv)
3131
static const int NOPTS = sizeof(vname) / sizeof(*vname);
3232
#undef OPT
3333

34-
int sock, ret = 0, val[NOPTS], rval, i;
34+
int sock, usock, sk, ret = 0, val[NOPTS], rval, i;
3535
socklen_t len = sizeof(int);
3636

3737
test_init(argc, argv);
@@ -42,22 +42,29 @@ int main(int argc, char **argv)
4242
return 1;
4343
}
4444

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+
4551
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);
4754
if (ret) {
4855
pr_perror("can't get %s", vname[i].name);
4956
return 1;
5057
}
5158

5259
val[i]++;
5360

54-
ret = setsockopt(sock, SOL_SOCKET, vname[i].opt, &val[i], len);
61+
ret = setsockopt(sk, SOL_SOCKET, vname[i].opt, &val[i], len);
5562
if (ret) {
5663
pr_perror("can't set %s = %d", vname[i].name, val[i]);
5764
return 1;
5865
}
5966

60-
ret = getsockopt(sock, SOL_SOCKET, vname[i].opt, &rval, &len);
67+
ret = getsockopt(sk, SOL_SOCKET, vname[i].opt, &rval, &len);
6168
if (ret) {
6269
pr_perror("can't re-get %s", vname[i].name);
6370
return 1;
@@ -78,28 +85,21 @@ int main(int argc, char **argv)
7885
test_waitsig();
7986

8087
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);
8290
if (ret) {
8391
pr_perror("can't verify %s", vname[i].name);
8492
return 1;
8593
}
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-
}
9494

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);
9797
return 1;
9898
}
9999
}
100100

101101
pass();
102102
close(sock);
103-
103+
close(usock);
104104
return 0;
105105
}

0 commit comments

Comments
 (0)