From: Leo Martins Date: Tue, 24 Mar 2026 19:09:52 +0000 (-0700) Subject: btrfs: fix stale errno check in btrfs_encoded_read/write helpers X-Git-Tag: v2026.04.20~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2d614deaed2919f73ff9595fb0cec5ff37201aa9;p=xfstests-dev.git btrfs: fix stale errno check in btrfs_encoded_read/write helpers The atoll() error check `if (offset == 0 && errno != 0)` can falsely trigger because errno is not cleared before the call. Library initialization code (e.g. libcap calling prctl(PR_CAPBSET_READ) which fails with EINVAL) can leave errno set to a non-zero value. When the caller passes offset=0 (a valid value), atoll() returns 0 without modifying errno, and the stale errno causes the helper to print usage and exit. This caused btrfs/333 to fail consistently on systems where libcap is linked, since every call with offset 0 would bail out. Fix by clearing errno before the atoll() calls in both btrfs_encoded_read and btrfs_encoded_write helpers. Signed-off-by: Leo Martins Reviewed-by: Mark Harmstone Signed-off-by: Zorro Lang --- diff --git a/src/btrfs_encoded_read.c b/src/btrfs_encoded_read.c index 3ee0d8b0..c7c25b74 100644 --- a/src/btrfs_encoded_read.c +++ b/src/btrfs_encoded_read.c @@ -178,6 +178,7 @@ int main(int argc, char *argv[]) filename = argv[2]; + errno = 0; offset = atoll(argv[3]); if (offset == 0 && errno != 0) { usage(); diff --git a/src/btrfs_encoded_write.c b/src/btrfs_encoded_write.c index 7e46d9fe..bc05cc3b 100644 --- a/src/btrfs_encoded_write.c +++ b/src/btrfs_encoded_write.c @@ -179,6 +179,7 @@ int main(int argc, char *argv[]) filename = argv[2]; + errno = 0; offset = atoll(argv[3]); if (offset == 0 && errno != 0) { usage();