X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsecure-mount.c;h=6dc2c41851a0ce121a0299cbbaa2d7757ad3bf16;hb=f5d5a2f7636afdb9eb9ae7d5a80b2aaf84d9b7af;hp=a722f1fc637d7c75d03e30d69b17e44a7820f937;hpb=3a3702c1e9d56814fd40646745cdecbd3062fe23;p=util-vserver.git diff --git a/src/secure-mount.c b/src/secure-mount.c index a722f1f..6dc2c41 100644 --- a/src/secure-mount.c +++ b/src/secure-mount.c @@ -279,8 +279,8 @@ updateMtab(struct MountInfo const *mnt, struct Options const *opt) goto err0; } - if (flock(fd, LOCK_EX)==-1) { - perror("secure-mount: flock()"); + if (lockf(fd, F_LOCK, 0)==-1) { + perror("secure-mount: lockf()"); goto err1; } @@ -436,6 +436,20 @@ mountSingle(struct MountInfo const *mnt, struct Options const *opt) perror("secure-mount: mount()"); return false; } + if ((mnt->flag & MS_BIND) && + (mnt->flag & ~(MS_BIND|MS_REC))) { + /* This is needed to put us in the new mountpoint */ + if (!secureChdir(mnt->dst, opt)) + return false; + if (mount(mnt->src, ".", + mnt->type ? mnt->type : "", + ((mnt->flag & ~(MS_BIND|MS_REC)) | + MS_REMOUNT), NULL) == -1 && + errno != EBUSY) { /* Returned on older kernels */ + perror("secure-mount: mount()"); + return false; + } + } } else if (!callExternalMount(mnt)) return false;