From b121f98160340a5b4cd6332cf32491d50de7df38 Mon Sep 17 00:00:00 2001 From: yvt Date: Fri, 7 Apr 2023 23:04:07 +0900 Subject: [PATCH] fuse-7z-ng: add patch to zero-init `struct fuse_operations` Fixes segfault when reading archive files. `struct fuse_operations` contains function pointers specifying a filesystem's behavior for each operation. For unimplemented operations, they must be set to null so that libfuse can fall back to a default implementation or return an error. In fuse-7z-ng, however, they were left uninitialized, causing segfault due to garbage values stored in them. --- pkgs/tools/filesystems/fuse-7z-ng/default.nix | 3 +++ .../fuse-7z-ng/zero-init-fuse-operations.patch | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 pkgs/tools/filesystems/fuse-7z-ng/zero-init-fuse-operations.patch diff --git a/pkgs/tools/filesystems/fuse-7z-ng/default.nix b/pkgs/tools/filesystems/fuse-7z-ng/default.nix index d400891a2054..e7749f63a99e 100644 --- a/pkgs/tools/filesystems/fuse-7z-ng/default.nix +++ b/pkgs/tools/filesystems/fuse-7z-ng/default.nix @@ -14,6 +14,9 @@ stdenv.mkDerivation rec { # Drop unused pthread library. pthread_yield() # fails the configure. ./no-pthread.patch + # Zero-initialize unset fields of `struct fuse_operations` so that + # garbage values don't cause segfault. + ./zero-init-fuse-operations.patch ]; nativeBuildInputs = [ pkg-config makeWrapper autoconf automake ]; diff --git a/pkgs/tools/filesystems/fuse-7z-ng/zero-init-fuse-operations.patch b/pkgs/tools/filesystems/fuse-7z-ng/zero-init-fuse-operations.patch new file mode 100644 index 000000000000..c2d50308f248 --- /dev/null +++ b/pkgs/tools/filesystems/fuse-7z-ng/zero-init-fuse-operations.patch @@ -0,0 +1,12 @@ +Zero-initialize unset fields of `struct fuse_operations`. +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -195,7 +195,7 @@ main (int argc, char **argv) + mkdir(param.mountpoint, 0750); + } + +- struct fuse_operations fuse7z_oper; ++ struct fuse_operations fuse7z_oper = {0}; + fuse7z_oper.init = fuse7z_init; + fuse7z_oper.destroy = fuse7z_destroy; + fuse7z_oper.readdir = fuse7z_readdir;