File bash-4.3-pathtemp.patch of Package bash43

---
 lib/sh/tmpfile.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

--- lib/sh/tmpfile.c
+++ lib/sh/tmpfile.c	2015-10-19 13:35:30.869518731 +0000
@@ -36,6 +36,14 @@
 #include <stdio.h>
 #include <errno.h>
 
+#if defined(__linux__)
+#  include <sys/statfs.h>
+#  include <unistd.h>
+#  ifndef  TMPFS_MAGIC
+#    define TMPFS_MAGIC 0x01021994
+#  endif
+#endif
+
 #include <shell.h>
 
 #ifndef errno
@@ -60,6 +68,8 @@ static unsigned long filenum = 1L;
 static char *
 get_sys_tmpdir ()
 {
+  static int doshm;
+
   if (sys_tmpdir)
     return sys_tmpdir;
 
@@ -86,6 +96,31 @@ get_sys_tmpdir ()
   return sys_tmpdir;
 }
 
+#if defined(__linux__)
+static int
+emergency_sys_tmpdir ()
+{
+  static char *shm = "/dev/shm";
+  static size_t pgsz;
+  struct statfs fs;
+  static int doshm;
+
+  if (getuid() != 0)
+    return 0;
+
+  if (doshm)
+    return 0;
+
+  doshm++;
+
+  if (statfs(shm, &fs) < 0 || fs.f_type != TMPFS_MAGIC || eaccess(shm, W_OK|X_OK))
+    return 0;
+	  
+  sys_tmpdir = shm;
+  return 1;
+}
+#endif
+
 static char *
 get_tmpdir (flags)
      int flags;
@@ -164,6 +199,7 @@ sh_mktmpfd (nameroot, flags, namep)
   int fd, tdlen;
 
   filename = (char *)xmalloc (PATH_MAX + 1);
+enospace:
   tdir = get_tmpdir (flags);
   tdlen = strlen (tdir);
 
@@ -177,6 +213,10 @@ sh_mktmpfd (nameroot, flags, namep)
       free (filename);
       filename = NULL;
     }
+
+  if (fd < 0 && errno == ENOSPC && emergency_sys_tmpdir())
+    goto enospace;
+
   if (namep)
     *namep = filename;
   return fd;
@@ -194,6 +234,9 @@ sh_mktmpfd (nameroot, flags, namep)
     }
   while (fd < 0 && errno == EEXIST);
 
+  if (fd < 0 && errno == ENOSPC && emergency_sys_tmpdir())
+    goto enospace;
+
   if (namep)
     *namep = filename;
   else
openSUSE Build Service is sponsored by