libstore: chown to builder variant for file descriptors
We use it immediately for the build temporary directory. Change-Id: I180193c63a2b98721f5fb8e542c4e39c099bb947 Signed-off-by: Raito Bezarius <raito@lix.systems>
This commit is contained in:
@@ -495,7 +495,7 @@ try {
|
||||
if (!tmpDirFd)
|
||||
throw SysError("failed to open the build temporary directory descriptor '%1%'", tmpDir);
|
||||
|
||||
chownToBuilder(tmpDir);
|
||||
chownToBuilder(tmpDirFd);
|
||||
|
||||
for (auto & [outputName, status] : initialOutputs) {
|
||||
/* Set scratch path we'll actually use during the build.
|
||||
@@ -980,6 +980,13 @@ void LocalDerivationGoal::chownToBuilder(const Path & path)
|
||||
throw SysError("cannot change ownership of '%1%'", path);
|
||||
}
|
||||
|
||||
void LocalDerivationGoal::chownToBuilder(const AutoCloseFD & fd)
|
||||
{
|
||||
if (!buildUser) return;
|
||||
if (fchown(fd.get(), buildUser->getUID(), buildUser->getGID()) == -1)
|
||||
throw SysError("cannot change ownership of file '%1%'", fd.guessOrInventPath());
|
||||
}
|
||||
|
||||
|
||||
void LocalDerivationGoal::runChild()
|
||||
{
|
||||
|
||||
@@ -196,10 +196,18 @@ struct LocalDerivationGoal : public DerivationGoal
|
||||
kj::Promise<Result<void>> writeStructuredAttrs();
|
||||
|
||||
/**
|
||||
* Make a file owned by the builder.
|
||||
* Make a file owned by the builder addressed by its path.
|
||||
*
|
||||
* SAFETY: this function is prone to TOCTOU as it receives a path and not a descriptor.
|
||||
* It's only safe to call in a child of a directory only visible to the owner.
|
||||
*/
|
||||
void chownToBuilder(const Path & path);
|
||||
|
||||
/**
|
||||
* Make a file owned by the builder addressed by its file descriptor.
|
||||
*/
|
||||
void chownToBuilder(const AutoCloseFD & fd);
|
||||
|
||||
int getChildStatus() override;
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user