File: zdtm-static-sock_opts00-use-unix-socket-to-test-SO_P.patch

package info (click to toggle)
criu 4.1.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 11,548 kB
  • sloc: ansic: 137,494; python: 7,323; sh: 3,703; java: 2,799; makefile: 2,574; asm: 1,137; perl: 206; xml: 117; exp: 45
file content (83 lines) | stat: -rw-r--r-- 2,621 bytes parent folder | download
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