Remove UserLock self-lock check

This is no longer needed since we're not using POSIX locks anymore.
This commit is contained in:
Eelco Dolstra 2019-12-09 23:57:33 +01:00
parent 3b9c9d34e5
commit 61cc9f34d2

View file

@ -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);