[CRIU] [PATCH v3] zdtm: test that UNIX socket owner/group don't change

Pavel Tikhomirov ptikhomirov at parallels.com
Fri Aug 22 00:27:01 PDT 2014


In container c/r(OVZ) if UNIX socket was created on tmpfs uid and gid
might have become corrupted.
To recreate this case in CRIU, need to mount tmpfs in mount namespace,
so it will be explictly restored.

run: bash test/zdtm.sh ns/static/sockets00

https://jira.sw.ru/browse/PSBM-28427

changes:
v2 - cleanup headers, close socket, use err instead fail,
print id's on error.
v3 - move to sockets00, mount tmpfs and extend explanation.

Signed-off-by: Pavel Tikhomirov <ptikhomirov at parallels.com>
---
 test/zdtm.sh                      |  1 +
 test/zdtm/live/static/sockets00.c | 30 +++++++++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/test/zdtm.sh b/test/zdtm.sh
index 1fd9015..b337b0f 100755
--- a/test/zdtm.sh
+++ b/test/zdtm.sh
@@ -225,6 +225,7 @@ mntns_open
 mntns_link_remap
 mntns_link_ghost
 socket-uid-gid
+sockets00
 "
 
 source $(readlink -f `dirname $0`/env.sh) || exit 1
diff --git a/test/zdtm/live/static/sockets00.c b/test/zdtm/live/static/sockets00.c
index 6ff93ab..1e98154 100644
--- a/test/zdtm/live/static/sockets00.c
+++ b/test/zdtm/live/static/sockets00.c
@@ -11,6 +11,7 @@
 #include <sys/wait.h>
 #include <sys/un.h>
 #include <sys/stat.h>
+#include <sys/mount.h>
 #include <limits.h>
 #include <fcntl.h>
 
@@ -36,6 +37,9 @@ int main(int argc, char *argv[])
 	char path[PATH_MAX];
 	char buf[64];
 	char *cwd;
+	uid_t uid = 18943;
+	gid_t gid = 58467;
+	char *tmpfs_dir = "tmpfs";
 
 	int ret;
 
@@ -47,7 +51,19 @@ int main(int argc, char *argv[])
 		exit(1);
 	}
 
-	snprintf(path, sizeof(path), "%s/%s", cwd, filename);
+	snprintf(path, sizeof(path), "%s/%s", cwd, tmpfs_dir);
+	rmdir(path);
+	if(mkdir(path, 0777)) {
+		err("mkdir\n");
+		exit(1);
+	}
+
+	if(mount("none", path, "tmpfs", 0, "mode=0755,uid=99")) {
+		err("mount tmpfs\n");
+		exit(1);
+	}
+
+	snprintf(path, sizeof(path), "%s/%s/%s", cwd, tmpfs_dir, filename);
 	unlink(path);
 
 	addr.sun_family = AF_UNIX;
@@ -74,6 +90,12 @@ int main(int argc, char *argv[])
 		exit(1);
 	}
 
+	ret = chown(path, uid, gid);
+	if (ret) {
+		err("chown");
+		exit(1);
+	}
+
 	ret = listen(ssk_icon[0], 16);
 	if (ret) {
 		fail("bind\n");
@@ -119,6 +141,12 @@ int main(int argc, char *argv[])
 		exit(1);
 	}
 
+	if (st_b.st_uid != uid || st_b.st_gid != gid) {
+		err("Owner user or group for %s corrupted, uid=%d, gid=%d",
+		    path, st_b.st_uid, st_b.st_gid);
+		exit(1);
+	}
+
 	ret = accept(ssk_icon[0], NULL, NULL);
 	if (ret < 0) {
 		fail("accept\n");
-- 
1.9.3



More information about the CRIU mailing list