From: Christian Brauner Date: Tue, 14 Aug 2018 11:00:29 +0000 (+0200) Subject: lxccontainer: fix F_OFD_GETLK checks X-Git-Tag: lxc-3.1.0~164^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec74f3f859dbe04a62e7dcb169ce6a5baf81841b;p=thirdparty%2Flxc.git lxccontainer: fix F_OFD_GETLK checks When we check whether an open file description lock has been taken on a file we need to set the l_pid field to 0 otherwise the kernel will send back EINVAL. Additionally, the kernel will not do pid translation and simply set the l_pid value to -1. Fixes https://discuss.linuxcontainers.org/t/container-deleted-or-stopped-when-lxc-ls-executed-concurrently/2439 Signed-off-by: Christian Brauner --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 2e8674723..04c2f672b 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -164,7 +164,10 @@ static int ongoing_create(struct lxc_container *c) lk.l_type = F_WRLCK; lk.l_whence = SEEK_SET; - lk.l_pid = -1; + /* F_OFD_GETLK requires that l_pid be set to 0 otherwise the kernel + * will EINVAL us. + */ + lk.l_pid = 0; ret = fcntl(fd, F_OFD_GETLK, &lk); if (ret < 0 && errno == EINVAL) @@ -172,8 +175,9 @@ static int ongoing_create(struct lxc_container *c) close(fd); - if (ret == 0 && lk.l_pid != -1) - /* create is still ongoing */ + /* F_OFD_GETLK will not send us back a pid so don't check it. */ + if (ret == 0) + /* Create is still ongoing. */ return 1; /* Create completed but partial is still there. */