Skip to content

Commit

Permalink
Ignore EPERM when unsharing FS state
Browse files Browse the repository at this point in the history
On Docker (but not podman), unshare(CLONE_FS) fails with EPERM. So
let's ignore it and hope nothing bad happens.

Attempted fix for #5777.
  • Loading branch information
edolstra committed Dec 16, 2021
1 parent c260640 commit ec8f24e
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 7 deletions.
8 changes: 1 addition & 7 deletions src/libstore/filetransfer.cc
Expand Up @@ -544,13 +544,7 @@ struct curlFileTransfer : public FileTransfer
stopWorkerThread();
});

#ifdef __linux__
/* Cause this thread to not share any FS attributes with the main thread,
because this causes setns() in restoreMountNamespace() to fail.
Ideally, this would happen in the std::thread() constructor. */
if (unshare(CLONE_FS) != 0)
throw SysError("unsharing filesystem state in download thread");
#endif
unshareFilesystem();

std::map<CURL *, std::shared_ptr<TransferItem>> items;

Expand Down
8 changes: 8 additions & 0 deletions src/libutil/util.cc
Expand Up @@ -1660,6 +1660,14 @@ void restoreMountNamespace()
#endif
}

void unshareFilesystem()
{
#ifdef __linux__
if (unshare(CLONE_FS) != 0 && errno != EPERM)
throw SysError("unsharing filesystem state in download thread");
#endif
}

void restoreProcessContext(bool restoreMounts)
{
restoreSignals();
Expand Down
5 changes: 5 additions & 0 deletions src/libutil/util.hh
Expand Up @@ -311,6 +311,11 @@ void saveMountNamespace();
if saveMountNamespace() was never called. */
void restoreMountNamespace();

/* Cause this thread to not share any FS attributes with the main
thread, because this causes setns() in restoreMountNamespace() to
fail. */
void unshareFilesystem();


class ExecError : public Error
{
Expand Down

0 comments on commit ec8f24e

Please sign in to comment.