BASH PATCH REPORT ================= Bash-Release: 5.3 Patch-ID: bash53-002 Bug-Reported-by: Bug-Reference-ID: Bug-Reference-URL: https://savannah.gnu.org/bugs/?67326 Bug-Description: There are too many differences in the various implementations of shm_open(2) to rely on it for bash's use. Patch (apply with `patch -p0'): *** ../bash-5.3-patched/lib/sh/anonfile.c Tue Jul 9 11:41:57 2024 --- lib/sh/anonfile.c Thu Jul 17 11:03:23 2025 *************** *** 26,30 **** #include ! #if defined (HAVE_MEMFD_CREATE) || defined (HAVE_SHM_OPEN) || defined (HAVE_SHM_MKSTEMP) # include #endif --- 26,30 ---- #include ! #if defined (HAVE_MEMFD_CREATE) || defined (HAVE_SHM_MKSTEMP) # include #endif *************** *** 42,57 **** #endif ! #if defined (HAVE_SHM_OPEN) ! #ifndef O_NOFOLLOW ! # define O_NOFOLLOW 0 ! #endif ! static int - anonshmunlink (const char *fn) - { - return (shm_unlink (fn)); - } - - static int anonshmopen (const char *name, int flags, char **fn) { --- 42,47 ---- #endif ! #if defined (HAVE_SHM_MKSTEMP) static int anonshmopen (const char *name, int flags, char **fn) { *************** *** 63,95 **** *fn = 0; - #if defined (HAVE_SHM_MKSTEMP) fname = savestring ("/shm-XXXXXXXXXX"); fd = shm_mkstemp (fname); if (fd < 0) - free (fname); - #endif - - if (fd < 0) { - fname = sh_mktmpname (name, flags); - fd = shm_open (fname, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600); - } - - if (fd < 0) - { free (fname); return fd; } - if (shm_unlink (fname) < 0) - { - int o; - o = errno; - free (fname); - close (fd); - errno = o; - return -1; - } - if (fn) *fn = fname; --- 53,64 ---- *************** *** 123,127 **** flag = (name && *name == '/') ? MT_TEMPLATE : MT_USETMPDIR; ! #if defined (HAVE_SHM_OPEN) fd = anonshmopen (name, flag, fn); if (fd >= 0) --- 92,96 ---- flag = (name && *name == '/') ? MT_TEMPLATE : MT_USETMPDIR; ! #if defined (HAVE_SHM_MKSTEMP) fd = anonshmopen (name, flag, fn); if (fd >= 0) *** ../bash-5.3/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 --- patchlevel.h 2020-10-01 11:01:28.000000000 -0400 *************** *** 26,30 **** looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 1 #endif /* _PATCHLEVEL_H_ */ --- 26,30 ---- looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 2 #endif /* _PATCHLEVEL_H_ */