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

Florian Weimer fweimer@redhat.com
Fri Jun 20 07:00:19 GMT 2025


* Maciej W. Rozycki:

> 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

This is okay.

Reviewed-by: Florian Weimer <fweimer@redhat.com>

Thanks,
Florian



More information about the Libc-alpha mailing list