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

Reply via email to