Skip to content

Commit 1880e44

Browse files
author
Dong Sunchao
committed
zdtm/static/sock_opts00: use unix socket to test SO_PASSCRED and SO_PASSSEC
SO_PASSCRED and SO_PASSSEC are only valid for AF_UNIX and AF_NETLINK. This patch updates the test logic to use a unix socket for these options, while preserving the original value consistency check. Fixes: #2705 Signed-off-by: Dong Sunchao <[email protected]>
1 parent 17a5c6e commit 1880e44

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

test/zdtm/static/sock_opts00.c

Lines changed: 16 additions & 9 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,21 +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
}
8694

87-
if (val[i] != rval) {
88-
errno = 0;
89-
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);
9097
return 1;
9198
}
9299
}
93100

94101
pass();
95102
close(sock);
96-
103+
close(usock);
97104
return 0;
98105
}

0 commit comments

Comments
 (0)