fix canon-cups-ufr2 for previously broken printers #79689
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The ufr2 driver relies on black-box binaries from Canon, with baked-in FHS assumptions. Previously, a
LD_PRELOAD
shim has been used to adapt calls to some libc functions and correct the path arguments passed. Unfortunately, this hack doesn't work for all printers; some of the Canon libraries rely on invoking syscalls directly, and can't be mollified withld.so
tricks.And so blacker arts were needed. Introduce a wrapper that uses
ptrace
to intercept all syscalls performed by the binary; when a supported syscall is identified, read its path argument from the binary's address space, see if it's a broken FHS path, and if necessary inject a corrected path into the process's address space before allowing the fixed-up syscall to proceed.This has some pros and cons. The cons:
ptrace
is sometimes restricted (it's allowed under the default NixOS config though)ptrace
is only available on Linux (but I think installing cups drivers through nix only makes sense on NixOS?)The pros:
Fixes #44330
Things done
sandbox
innix.conf
on non-NixOS linux)nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
./result/bin/
)nix path-info -S
before and after)