[glibc] Linux: Fix '__close_nocancel_nostatus' clobbering 'errno' [BZ #33035]

Maciej W. Rozycki macro@sourceware.org
Tue Jun 24 20:18:54 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=3b0d495ac406f14131d299e933b49bfdd02bf626

commit 3b0d495ac406f14131d299e933b49bfdd02bf626
Author: Maciej W. Rozycki <macro@redhat.com>
Date:   Tue Jun 24 21:17:25 2025 +0100

    Linux: Fix '__close_nocancel_nostatus' clobbering 'errno' [BZ #33035]
    
    Fix fallout from commit c181840c93d3 ("Consolidate non cancellable close
    call") that caused '__close_nocancel_nostatus' to clobber 'errno' on a
    close(2) failure, a 2.27 regression.
    
    The problem came from a rewrite from 'close_not_cancel_no_status' to
    '__close_nocancel_nostatus' switching from an inline implementation that
    used INTERNAL_SYSCALL macro (which stays away from 'errno') to a call to
    '__close_nocancel' function that uses INLINE_SYSCALL_CALL macro (which
    does poke at 'errno').
    
    Implement '__close_nocancel_nostatus' in terms of INTERNAL_SYSCALL_CALL
    then, which leaves 'errno' intact.
    
    Reviewed-by: Florian Weimer <fweimer@redhat.com>

Diff:
---
 sysdeps/unix/sysv/linux/not-cancel.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h
index ece329711b..73761ab04b 100644
--- a/sysdeps/unix/sysv/linux/not-cancel.h
+++ b/sysdeps/unix/sysv/linux/not-cancel.h
@@ -73,7 +73,7 @@ hidden_proto (__fcntl64_nocancel)
 static inline void
 __close_nocancel_nostatus (int fd)
 {
-  __close_nocancel (fd);
+  INTERNAL_SYSCALL_CALL (close, fd);
 }
 
 /* Non cancellable writev syscall that does not also set errno in case of


More information about the Glibc-cvs mailing list