OBS-URL: https://build.opensuse.org/package/show/Base:System/bash?expand=0&rev=403
91 lines
1.8 KiB
Diff
91 lines
1.8 KiB
Diff
---
|
|
lib/sh/tmpfile.c | 42 ++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 42 insertions(+)
|
|
|
|
--- lib/sh/tmpfile.c
|
|
+++ lib/sh/tmpfile.c 2025-01-31 14:26:40.473201839 +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
|
|
@@ -71,6 +79,8 @@ static unsigned long filenum = 1L;
|
|
static char *
|
|
get_sys_tmpdir (void)
|
|
{
|
|
+ static int doshm;
|
|
+
|
|
if (sys_tmpdir)
|
|
return sys_tmpdir;
|
|
|
|
@@ -97,6 +107,31 @@ get_sys_tmpdir (void)
|
|
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 (int flags)
|
|
{
|
|
@@ -214,6 +249,7 @@ sh_mktmpfd (const char *nameroot, int fl
|
|
const char *lroot;
|
|
int fd, tdlen;
|
|
|
|
+enospace:
|
|
filename = (char *)xmalloc (PATH_MAX + 1);
|
|
tdir = get_tmpdir (flags);
|
|
tdlen = strlen (tdir);
|
|
@@ -243,6 +279,10 @@ sh_mktmpfd (const char *nameroot, int fl
|
|
free (filename);
|
|
filename = NULL;
|
|
}
|
|
+
|
|
+ if (fd < 0 && errno == ENOSPC && emergency_sys_tmpdir())
|
|
+ goto enospace;
|
|
+
|
|
if (namep)
|
|
*namep = filename;
|
|
|
|
@@ -282,6 +322,8 @@ sh_mktmpfd (const char *nameroot, int fl
|
|
free (filename);
|
|
filename = NULL;
|
|
}
|
|
+ if (fd < 0 && errno == ENOSPC && emergency_sys_tmpdir())
|
|
+ goto enospace;
|
|
|
|
if (namep)
|
|
*namep = filename;
|