setcap: fix errno display The commit 056ffb0bd25d91ffbcb83c521fc4d3d9904ec4d4 broke the display of the final error message because it would do more operations that would clobber errno. Example: (libcap-2.22) sudo setcap cap_ipc_lock=ep /proc/filesystems | head -1 Failed to set capabilities on file `/proc/filesystems' (Operation not supported) (libcap-2.23) sudo setcap cap_ipc_lock=ep /proc/filesystems | head -1 Failed to set capabilities on file `/proc/filesystems' (Invalid argument) Save the original errno value and use that for the final display instead. URL: https://bugs.gentoo.org/551672 Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
diff --git a/progs/setcap.c b/progs/setcap.c index 83090ae..7304343 100644 --- a/progs/setcap.c +++ b/progs/setcap.c
@@ -171,6 +171,7 @@ retval = cap_set_file(*++argv, cap_d); if (retval != 0) { int explained = 0; + int oerrno = errno; #ifdef linux cap_value_t cap; cap_flag_value_t per_state; @@ -193,7 +194,7 @@ fprintf(stderr, "Failed to set capabilities on file `%s' (%s)\n", - argv[0], strerror(errno)); + argv[0], strerror(oerrno)); if (!explained) { usage(); }