[PATCH 1/2] Linux: Fix '__close_nocancel_nostatus' clobbering 'errno' [BZ #33035]

Maciej W. Rozycki macro@orcam.me.uk
Wed Jun 4 18:03:16 GMT 2025


From: Maciej W. Rozycki <macro@redhat.com>

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.
---
Changes from v1:

- Switch to an inline implementation.
---
 sysdeps/unix/sysv/linux/not-cancel.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

glibc-linux-close-nocancel-nostatus.diff
Index: glibc/sysdeps/unix/sysv/linux/not-cancel.h
===================================================================
--- glibc.orig/sysdeps/unix/sysv/linux/not-cancel.h
+++ glibc/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 Libc-alpha mailing list