From 565e0f583461809fc1c506f85b6f624627f17ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dav=C3=AD=C3=B0=20Steinn=20Geirsson?= Date: Wed, 25 Mar 2026 22:08:55 +0000 Subject: [PATCH] feat: add nix fuzz devShell and fuzz-usbip app with --fork support Co-Authored-By: Claude Opus 4.6 (1M context) --- flake.lock | 23 +++++++++++++++++++- flake.nix | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index 752172b..06d59b7 100644 --- a/flake.lock +++ b/flake.lock @@ -37,7 +37,28 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774408260, + "narHash": "sha256-Jn9d9r85dmf3gTMnSRt6t+DP2nQ5uJns/MMXg2FpzfM=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "d6471ee5a8f470251e6e5b83a20a182eb6c46c9b", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index 24a7bf0..1c856c8 100644 --- a/flake.nix +++ b/flake.nix @@ -4,9 +4,13 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, flake-utils }: + outputs = { self, nixpkgs, flake-utils, rust-overlay }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; @@ -44,6 +48,8 @@ mainProgram = "usbip-rs"; }; }; + + rust-nightly = rust-overlay.packages.${system}.rust-nightly; in { packages = { @@ -55,8 +61,57 @@ default = usbip-rs; }; - devShells.default = pkgs.mkShell { - inherit nativeBuildInputs buildInputs; + devShells = { + default = pkgs.mkShell { + inherit nativeBuildInputs buildInputs; + }; + + fuzz = pkgs.mkShell { + buildInputs = [ + rust-nightly + pkgs.cargo-fuzz + pkgs.libusb1 + ] ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isLinux [ + pkgs.udev + ]; + nativeBuildInputs = [ pkgs.stdenv.cc pkgs.pkg-config ]; + }; + }; + + apps = let + fuzz-usbip = pkgs.writeShellScriptBin "fuzz-usbip" '' + set -euo pipefail + export PATH="${rust-nightly}/bin:${pkgs.cargo-fuzz}/bin:${pkgs.stdenv.cc}/bin:${pkgs.pkg-config}/bin:$PATH" + export PKG_CONFIG_PATH="${pkgs.libusb1.dev}/lib/pkgconfig''${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"${pkgs.lib.optionalString pkgs.stdenv.hostPlatform.isLinux '':${pkgs.udev.dev}/lib/pkgconfig''} + cd "$(${pkgs.git}/bin/git rev-parse --show-toplevel)/lib" + if [ $# -eq 0 ]; then + cargo fuzz list + else + target="$1" + shift + fork=0 + args=() + for arg in "$@"; do + case "$arg" in + --fork=*) fork=''${arg#--fork=} ;; + *) args+=("$arg") ;; + esac + done + if [ "$fork" -gt 0 ]; then + while true; do + cargo fuzz run "$target" -- -max_len=1048576 "-fork=$fork" "''${args[@]}" || true + echo "--- fuzzer exited, restarting (artifacts saved) ---" + done + else + cargo fuzz run "$target" -- -max_len=1048576 "''${args[@]}" + fi + fi + ''; + in { + fuzz-usbip = { + type = "app"; + program = "${fuzz-usbip}/bin/fuzz-usbip"; + }; }; }); }