Skip to content

WIP SLOP use descriptors to avoid TOCTOU for canonicalising file system meta data#15120

Draft
Ericson2314 wants to merge 3 commits intoNixOS:masterfrom
obsidiansystems:canonicalize-toctou
Draft

WIP SLOP use descriptors to avoid TOCTOU for canonicalising file system meta data#15120
Ericson2314 wants to merge 3 commits intoNixOS:masterfrom
obsidiansystems:canonicalize-toctou

Conversation

@Ericson2314
Copy link
Member

Motivation

I suppose we should have a big issue for all the no TOCTOU, yes Descriptor work, to link here.

Context

This should not happen now, but instead happen after

I suspect what we'll want to do is expose that source accessor after
all, so we can have some extra methods to get at the underlying file
descriptors. (Or, conversely, maybe this won't be necessary, because enough of the
underlying logic will be factored into file-descriptor.hh functions
that the SourceAccessor itself will be a small wrapper.)

Either way, at that point we'll not be duplicating stuff here, nor will
be lacking a foundation on Windows, and we can then finish the job.


Add 👍 to pull requests you find important.

The Nix maintainer team uses a GitHub project board to schedule and track reviews.

@github-actions github-actions bot added new-cli Relating to the "nix" command store Issues and pull requests concerning the Nix store fetching Networking with the outside (non-Nix) world, input locking labels Jan 30, 2026
@Ericson2314 Ericson2314 force-pushed the canonicalize-toctou branch 2 times, most recently from 7fd06b1 to 0ed6078 Compare February 16, 2026 22:26
- FD-based creating symlinks on Unix and Windows with wrapper
  (`createSymlinkAt`, `createDirectoryAt`).

- Big cleanup of `fs-sink.cc` to take advantage of new stuff and
  reduce CPP.

- Reimplement `lstat` and `maybeLstat` from first principles on Windows,
  so they work with symlinks. Properly define `S_IFLNK` and `S_ISLNK`.

- Start fixing bugs in Windows now that we can run the tests locally
  with wine decently well enough.

- Make `descriptorToPath` cross-platform (renamed from
  `windows::handleToPath`). Uses `/proc/self/fd` on Linux and
  `F_GETPATH` on macOS. Add `HAVE_F_GETPATH` meson check.

  This is based on 7226a11, which was
  removed in 479c356, but is now
  introduced more judiciously.

- Unix error messages in `readFull`, `writeFull`, `readLine` now include
  file paths via `descriptorToPath`.

- Refactor `fsync` to be a standalone function that `AutoCloseFD::fsync()`
  calls.

- Change `writeFile(AutoCloseFD &, ...)` to take a `Descriptor` with
  optional `origPath` parameter (uses `descriptorToPath` if not provided).
- Implement wrappers for the descriptor-based ones too.

- Do the `maybe*` ones in terms of the others via try-catch, portably.
…em meta data

This should not happen now, but instead happen after

- NixOS#15119
- NixOS#15060
- Sergei's upcoming new `Descriptor`-based `SourceAccessor`

I suspect what we'll want to do is expose that source accessor after
all, so we can have some extra methods to get at the underlying file
descriptors. (Or, conversely, maybe this won't be necessary, because enough of the
underlying logic will be factored into `file-descriptor.hh` functions
that the `SourceAccessor` itself will be a small wrapper.)

Either way, at that point we'll not be duplicating stuff here, nor will
be lacking a foundation on Windows, and we can then finish the job.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fetching Networking with the outside (non-Nix) world, input locking new-cli Relating to the "nix" command store Issues and pull requests concerning the Nix store

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant