From dfc2d45cf52f0dca54fc4a7ee343834d31e670d4 Mon Sep 17 00:00:00 2001 From: Brandon Lucas Date: Fri, 13 Feb 2026 08:19:52 -0500 Subject: [PATCH] Fix bash trap variable scope bug in QR camera scanner The cleanup_camera trap handler couldn't access local variables (ffmpeg_pid, tmpdir) when triggered, causing "unbound variable" errors with set -u. Fixed by using global paths with $$ suffix that the trap can reference directly. Co-Authored-By: Claude Opus 4.5 --- setup | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/setup b/setup index ecb8477..f2040bd 100755 --- a/setup +++ b/setup @@ -216,15 +216,18 @@ scan_qr_camera() { return 1 fi - local tmpdir="/tmp/usync_qr_$$" - local result_file="$tmpdir/result" - local ffmpeg_pid="" + # Use fixed paths (with PID) that cleanup can access without local vars + USYNC_QR_TMPDIR="/tmp/usync_qr_$$" + USYNC_QR_PIDFILE="/tmp/usync_qr_pid_$$" - mkdir -p "$tmpdir" + mkdir -p "$USYNC_QR_TMPDIR" cleanup_camera() { - [[ -n "$ffmpeg_pid" ]] && kill "$ffmpeg_pid" 2>/dev/null || true - rm -rf "$tmpdir" + if [[ -f "/tmp/usync_qr_pid_$$" ]]; then + kill "$(cat "/tmp/usync_qr_pid_$$")" 2>/dev/null || true + rm -f "/tmp/usync_qr_pid_$$" + fi + rm -rf "/tmp/usync_qr_$$" } trap cleanup_camera RETURN EXIT @@ -237,9 +240,9 @@ scan_qr_camera() { ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 \ -vf "drawbox=x=iw/2-100:y=ih/2-100:w=200:h=200:color=green:t=3" \ -f sdl2 -window_title "Scan QR Code" - \ - -vf "fps=2" -update 1 -q:v 2 "$tmpdir/frame.jpg" \ + -vf "fps=2" -update 1 -q:v 2 "$USYNC_QR_TMPDIR/frame.jpg" \ -loglevel quiet 2>/dev/null & - ffmpeg_pid=$! + echo $! > "$USYNC_QR_PIDFILE" sleep 1 # Let camera warm up @@ -248,13 +251,13 @@ scan_qr_camera() { sleep 0.5 # Check if ffmpeg died - if ! kill -0 "$ffmpeg_pid" 2>/dev/null; then + if [[ ! -f "$USYNC_QR_PIDFILE" ]] || ! kill -0 "$(cat "$USYNC_QR_PIDFILE")" 2>/dev/null; then break fi - if [[ -f "$tmpdir/frame.jpg" ]]; then + if [[ -f "$USYNC_QR_TMPDIR/frame.jpg" ]]; then local result - result=$(zbarimg --raw -q "$tmpdir/frame.jpg" 2>/dev/null || true) + result=$(zbarimg --raw -q "$USYNC_QR_TMPDIR/frame.jpg" 2>/dev/null || true) if [[ -n "$result" ]]; then result=$(echo "$result" | tr -d ' \n\r' | tr '[:lower:]' '[:upper:]')