Hello,
Bash leaks heredoc fd to child processes if heredoc string contains command
substitution.
Reproducer code :
$ cat test.sh
#!/bin/bash
cat <<EOF
`pvs`
EOF
$ ./test.sh
File descriptor 3 (/tmp/sh-thd.Gnua0J) leaked on pvs invocation. Parent PID
9590: /bin/bash
PV VG Fmt Attr PSize PFree
/dev/sda2 fedora lvm2 a-- 11.00g 0
Attached patch fixes this leak.
--
--
Siteshwar Vashisht
From 6b7970ee787cf042182f8f93bf25c6e6453a8aef Mon Sep 17 00:00:00 2001
From: Siteshwar Vashisht <svashi...@redhat.com>
Date: Tue, 17 Jan 2017 10:28:34 +0100
Subject: [PATCH] Do not leak heredoc fd to child processes
---
lib/sh/tmpfile.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/sh/tmpfile.c b/lib/sh/tmpfile.c
index e41e45b..15fcb5c 100644
--- a/lib/sh/tmpfile.c
+++ b/lib/sh/tmpfile.c
@@ -42,7 +42,7 @@
extern int errno;
#endif
-#define BASEOPENFLAGS (O_CREAT | O_TRUNC | O_EXCL | O_BINARY)
+#define BASEOPENFLAGS (O_CREAT | O_TRUNC | O_EXCL | O_BINARY | O_CLOEXEC)
#define DEFAULT_TMPDIR "." /* bogus default, should be changed */
#define DEFAULT_NAMEROOT "shtmp"
@@ -195,7 +195,7 @@ sh_mktmpfd (nameroot, flags, namep)
#ifdef USE_MKSTEMP
sprintf (filename, "%s/%s.XXXXXX", tdir, lroot);
- fd = mkstemp (filename);
+ fd = mkostemp (filename, O_CLOEXEC);
if (fd < 0 || namep == 0)
{
free (filename);
--
2.9.3