Skip to content

Root: do not error out with EEXIST for racing Root::mkdir_all()s#131

Merged
cyphar merged 4 commits intomainfrom
root-mkdir_all-race
Dec 8, 2024
Merged

Root: do not error out with EEXIST for racing Root::mkdir_all()s#131
cyphar merged 4 commits intomainfrom
root-mkdir_all-race

Conversation

@cyphar
Copy link
Copy Markdown
Owner

@cyphar cyphar commented Dec 8, 2024

If two programs are doing Root::mkdir_all, the previous logic would
return an error if a directory already existed once we got into the
"mkdir" portion of the creation.

Since we already have to accept that an attacker can swap the inode with
a different directory, returning -EEXIST from mkdirat(2) just causes
spurious errors. All we care about is that we open a directory.

Fixes #128
Signed-off-by: Aleksa Sarai cyphar@cyphar.com

@cyphar cyphar added this to the 0.2.0 milestone Dec 8, 2024
It would be nice if there was an EUNSAFE we could use, but alas there is
no such errno, so we will have to reuse the same errno that openat2()
uses when a walk ends up outside of the rootfs.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
There is no reason to use the resolver to look a path component under a
directory we have a handle to already. The O_NOFOLLOW behaviour was also
somewhat hidden behind the way the resolver API works.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
If two programs are doing Root::mkdir_all, the previous logic would
return an error if a directory already existed once we got into the
"mkdir" portion of the creation.

Since we already have to accept that an attacker can swap the inode with
a different directory, returning -EEXIST from mkdirat(2) just causes
spurious errors. All we care about is that we open a directory.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
@cyphar cyphar merged commit 0c4213b into cyphar:main Dec 8, 2024
@cyphar cyphar deleted the root-mkdir_all-race branch June 12, 2025 23:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mkdir_all: don't return spurious errors for racing mkdirs

1 participant