forked from lix-project/lix
Remove UserLock self-lock check
This is no longer needed since we're not using POSIX locks anymore.
This commit is contained in:
parent
3b9c9d34e5
commit
61cc9f34d2
|
@ -499,12 +499,6 @@ void handleDiffHook(uid_t uid, uid_t gid, Path tryA, Path tryB, Path drvPath, Pa
|
||||||
class UserLock
|
class UserLock
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
/* POSIX locks suck. If we have a lock on a file, and we open and
|
|
||||||
close that file again (without closing the original file
|
|
||||||
descriptor), we lose the lock. So we have to be *very* careful
|
|
||||||
not to open a lock file on which we are holding a lock. */
|
|
||||||
static Sync<PathSet> lockedPaths_;
|
|
||||||
|
|
||||||
Path fnUserLock;
|
Path fnUserLock;
|
||||||
AutoCloseFD fdUserLock;
|
AutoCloseFD fdUserLock;
|
||||||
|
|
||||||
|
@ -515,7 +509,6 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UserLock();
|
UserLock();
|
||||||
~UserLock();
|
|
||||||
|
|
||||||
void kill();
|
void kill();
|
||||||
|
|
||||||
|
@ -529,9 +522,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Sync<PathSet> UserLock::lockedPaths_;
|
|
||||||
|
|
||||||
|
|
||||||
UserLock::UserLock()
|
UserLock::UserLock()
|
||||||
{
|
{
|
||||||
assert(settings.buildUsersGroup != "");
|
assert(settings.buildUsersGroup != "");
|
||||||
|
@ -568,47 +558,34 @@ UserLock::UserLock()
|
||||||
|
|
||||||
fnUserLock = (format("%1%/userpool/%2%") % settings.nixStateDir % pw->pw_uid).str();
|
fnUserLock = (format("%1%/userpool/%2%") % settings.nixStateDir % pw->pw_uid).str();
|
||||||
|
|
||||||
{
|
AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
|
||||||
auto lockedPaths(lockedPaths_.lock());
|
if (!fd)
|
||||||
if (!lockedPaths->insert(fnUserLock).second)
|
throw SysError(format("opening user lock '%1%'") % fnUserLock);
|
||||||
/* We already have a lock on this one. */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
if (lockFile(fd.get(), ltWrite, false)) {
|
||||||
|
fdUserLock = std::move(fd);
|
||||||
|
user = i;
|
||||||
|
uid = pw->pw_uid;
|
||||||
|
|
||||||
AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
|
/* Sanity check... */
|
||||||
if (!fd)
|
if (uid == getuid() || uid == geteuid())
|
||||||
throw SysError(format("opening user lock '%1%'") % fnUserLock);
|
throw Error(format("the Nix user should not be a member of '%1%'")
|
||||||
|
% settings.buildUsersGroup);
|
||||||
if (lockFile(fd.get(), ltWrite, false)) {
|
|
||||||
fdUserLock = std::move(fd);
|
|
||||||
user = i;
|
|
||||||
uid = pw->pw_uid;
|
|
||||||
|
|
||||||
/* Sanity check... */
|
|
||||||
if (uid == getuid() || uid == geteuid())
|
|
||||||
throw Error(format("the Nix user should not be a member of '%1%'")
|
|
||||||
% settings.buildUsersGroup);
|
|
||||||
|
|
||||||
#if __linux__
|
#if __linux__
|
||||||
/* Get the list of supplementary groups of this build user. This
|
/* Get the list of supplementary groups of this build user. This
|
||||||
is usually either empty or contains a group such as "kvm". */
|
is usually either empty or contains a group such as "kvm". */
|
||||||
supplementaryGIDs.resize(10);
|
supplementaryGIDs.resize(10);
|
||||||
int ngroups = supplementaryGIDs.size();
|
int ngroups = supplementaryGIDs.size();
|
||||||
int err = getgrouplist(pw->pw_name, pw->pw_gid,
|
int err = getgrouplist(pw->pw_name, pw->pw_gid,
|
||||||
supplementaryGIDs.data(), &ngroups);
|
supplementaryGIDs.data(), &ngroups);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
throw Error(format("failed to get list of supplementary groups for '%1%'") % pw->pw_name);
|
throw Error(format("failed to get list of supplementary groups for '%1%'") % pw->pw_name);
|
||||||
|
|
||||||
supplementaryGIDs.resize(ngroups);
|
supplementaryGIDs.resize(ngroups);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
} catch (...) {
|
|
||||||
lockedPaths_.lock()->erase(fnUserLock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,14 +595,6 @@ UserLock::UserLock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UserLock::~UserLock()
|
|
||||||
{
|
|
||||||
auto lockedPaths(lockedPaths_.lock());
|
|
||||||
auto erased = lockedPaths->erase(fnUserLock);
|
|
||||||
assert(erased);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UserLock::kill()
|
void UserLock::kill()
|
||||||
{
|
{
|
||||||
killUser(uid);
|
killUser(uid);
|
||||||
|
|
Loading…
Reference in a new issue