[lxc-devel] [PATCH 6/6] c/r: use mkstemp to get a pidfile name

Tycho Andersen tycho.andersen at canonical.com
Mon Apr 13 18:07:05 UTC 2015


This is more secure than tempnam().

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 src/lxc/lxccontainer.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 5b96b8c..8424cf6 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -4128,12 +4128,30 @@ out_unlock:
 static void do_restore(struct lxc_container *c, int pipe, char *directory, bool verbose)
 {
 	pid_t pid;
-	char pidfile[L_tmpnam];
+	char pidfile[sizeof(P_tmpdir) + 25];
 	struct lxc_handler *handler;
-	int status;
+	int status, ret;
+
+	ret = snprintf(pidfile, sizeof(pidfile), "%s/lxc_criu_pidfile.XXXXXX", P_tmpdir);
+	if (ret < 0 || ret >= sizeof(pidfile))
+		goto out;
+
+	/*
+	 * Here, we simply use mkstemp to acquire a secure tmpfile name. CRIU
+	 * tries to create the pidfile with O_CREAT | O_EXCL, so we need to
+	 * remove it before calling criu.
+	 */
+	ret = mkstemp(pidfile);
+	if (ret < 0) {
+		SYSERROR("failed to create pidfile");
+		goto out;
+	}
 
-	if (!tmpnam(pidfile))
+	close(ret);
+	if (remove(pidfile) < 0) {
+		SYSERROR("failed to remove pidfile");
 		goto out;
+	}
 
 	handler = lxc_init(c->name, c->lxc_conf, c->config_path);
 	if (!handler)
@@ -4231,6 +4249,12 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
 
 				ret = fscanf(f, "%d", (int*) &handler->pid);
 				fclose(f);
+
+				if (remove(pidfile) < 0) {
+					SYSERROR("failed to remove pidfile");
+					goto out_fini_handler;
+				}
+
 				if (ret != 1) {
 					ERROR("reading restore pid failed");
 					goto out_fini_handler;
-- 
2.1.4



More information about the lxc-devel mailing list