1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
From 2ea697ba2d7959a92a03cf894b7111485af22c4f Mon Sep 17 00:00:00 2001
From: Dong Sunchao <dongsunchao@gmail.com>
Date: Wed, 20 Aug 2025 12:38:18 +0000
Subject: [PATCH] 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 <dongsunchao@gmail.com>
---
test/zdtm/static/sock_opts00.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/test/zdtm/static/sock_opts00.c b/test/zdtm/static/sock_opts00.c
index fcf00ffed862..854aaa591144 100644
--- a/test/zdtm/static/sock_opts00.c
+++ b/test/zdtm/static/sock_opts00.c
@@ -31,7 +31,7 @@ int main(int argc, char **argv)
static const int NOPTS = sizeof(vname) / sizeof(*vname);
#undef OPT
- int sock, ret = 0, val[NOPTS], rval, i;
+ int sock, usock, sk, ret = 0, val[NOPTS], rval, i;
socklen_t len = sizeof(int);
test_init(argc, argv);
@@ -42,8 +42,15 @@ int main(int argc, char **argv)
return 1;
}
+ usock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (usock < 0) {
+ pr_perror("can't create unix socket");
+ return 1;
+ }
+
for (i = 0; i < NOPTS; i++) {
- ret = getsockopt(sock, SOL_SOCKET, vname[i].opt, &val[i], &len);
+ sk = vname[i].opt == SO_PASSCRED || vname[i].opt == SO_PASSSEC ? usock : sock;
+ ret = getsockopt(sk, SOL_SOCKET, vname[i].opt, &val[i], &len);
if (ret) {
pr_perror("can't get %s", vname[i].name);
return 1;
@@ -51,13 +58,13 @@ int main(int argc, char **argv)
val[i]++;
- ret = setsockopt(sock, SOL_SOCKET, vname[i].opt, &val[i], len);
+ ret = setsockopt(sk, SOL_SOCKET, vname[i].opt, &val[i], len);
if (ret) {
pr_perror("can't set %s = %d", vname[i].name, val[i]);
return 1;
}
- ret = getsockopt(sock, SOL_SOCKET, vname[i].opt, &rval, &len);
+ ret = getsockopt(sk, SOL_SOCKET, vname[i].opt, &rval, &len);
if (ret) {
pr_perror("can't re-get %s", vname[i].name);
return 1;
@@ -78,7 +85,8 @@ int main(int argc, char **argv)
test_waitsig();
for (i = 0; i < NOPTS; i++) {
- ret = getsockopt(sock, SOL_SOCKET, vname[i].opt, &rval, &len);
+ sk = vname[i].opt == SO_PASSCRED || vname[i].opt == SO_PASSSEC ? usock : sock;
+ ret = getsockopt(sk, SOL_SOCKET, vname[i].opt, &rval, &len);
if (ret) {
pr_perror("can't verify %s", vname[i].name);
return 1;
@@ -93,6 +101,7 @@ int main(int argc, char **argv)
pass();
close(sock);
+ close(usock);
return 0;
}
--
2.51.0
|