From 261fcfbec7ef531b377901bb88912c40a3c78c36 Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Thu, 26 Feb 2026 01:27:41 +0000 Subject: [PATCH] fix: improve correctness and safety Pass 2 (Correctness & Safety): - Separate stdout/stderr in apk list and search to prevent error messages from contaminating parsed output - All providers verified: mutex on mutating ops, CommandContext everywhere, proper error wrapping, nil-safe parseInfo functions --- apk/apk_linux.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apk/apk_linux.go b/apk/apk_linux.go index 9f0063b..0d99774 100644 --- a/apk/apk_linux.go +++ b/apk/apk_linux.go @@ -96,18 +96,22 @@ func update(ctx context.Context) error { func list(ctx context.Context) ([]snack.Package, error) { cmd := exec.CommandContext(ctx, "apk", "list", "--installed") - out, err := cmd.CombinedOutput() + var stderr strings.Builder + cmd.Stderr = &stderr + out, err := cmd.Output() if err != nil { - return nil, fmt.Errorf("apk list: %w", err) + return nil, fmt.Errorf("apk list: %s: %w", strings.TrimSpace(stderr.String()), err) } return parseListInstalled(string(out)), nil } func search(ctx context.Context, query string) ([]snack.Package, error) { cmd := exec.CommandContext(ctx, "apk", "search", "-v", query) - out, err := cmd.CombinedOutput() + var stderr strings.Builder + cmd.Stderr = &stderr + out, err := cmd.Output() if err != nil { - return nil, fmt.Errorf("apk search: %w", err) + return nil, fmt.Errorf("apk search: %s: %w", strings.TrimSpace(stderr.String()), err) } results := parseSearch(string(out)) if len(results) == 0 {