From 669b632579c213da730c783ad13472fe8835480b Mon Sep 17 00:00:00 2001 From: Kohei YOSHIDA Date: Thu, 22 Jan 2015 15:16:39 +0900 Subject: [PATCH] fix failed to fallback at lxclock_name lxclock_name will fallback to /tmp/$(id -u)/lxc$lxcpath/.$lxcname when failed to create directories into rundir. But, in currently, lxclock_name returns untill preparing directories under the /tmp, so invoker will fail to get the container lock. This patch fixes fixes this. Signed-off-by: Kohei YOSHIDA --- src/lxc/lxclock.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index ea9be3c54..922822c75 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -128,8 +128,11 @@ static char *lxclock_name(const char *p, const char *n) } ret = mkdir_p(dest, 0755); if (ret < 0) { - /* fall back to "/tmp/" $(id -u) "/lxc/" $lxcpath / $lxcname + '\0' */ - int l2 = 34 + strlen(n) + strlen(p); + /* fall back to "/tmp/" + $(id -u) + "/lxc" + $lxcpath + "/" + "." + $lxcname + '\0' + * * maximum length of $(id -u) is 10 calculated by (log (2 ** (sizeof(uid_t) * 8) - 1) / log 10 + 1) + * * lxcpath always starts with '/' + */ + int l2 = 22 + strlen(n) + strlen(p); if (l2 > len) { char *d; d = realloc(dest, l2); @@ -141,13 +144,19 @@ static char *lxclock_name(const char *p, const char *n) len = l2; dest = d; } - ret = snprintf(dest, len, "/tmp/%d/lxc/%s", geteuid(), p); + ret = snprintf(dest, len, "/tmp/%d/lxc%s", geteuid(), p); if (ret < 0 || ret >= len) { free(dest); free(rundir); return NULL; } - ret = snprintf(dest, len, "/tmp/%d/lxc/%s/.%s", geteuid(), p, n); + ret = mkdir_p(dest, 0755); + if (ret < 0) { + free(dest); + free(rundir); + return NULL; + } + ret = snprintf(dest, len, "/tmp/%d/lxc%s/.%s", geteuid(), p, n); } else ret = snprintf(dest, len, "%s/lock/lxc/%s/.%s", rundir, p, n); -- 2.47.2