61 lines
1.4 KiB
Diff
61 lines
1.4 KiB
Diff
|
diff -urp make-3.81/read.c make-3.81-leak/read.c
|
|||
|
--- make-3.81/read.c 2006-03-17 15:24:20.000000000 +0100
|
|||
|
+++ make-3.81-leak/read.c 2008-09-16 16:43:12.000000000 +0200
|
|||
|
@@ -296,6 +300,37 @@ restore_conditionals (struct conditional
|
|||
|
conditionals = saved;
|
|||
|
}
|
|||
|
|
|||
|
+/* If possible, open the file and mark it close-on-exec, so that make
|
|||
|
+ doesn't leak the descriptor to binaries called via $(shell ...).*/
|
|||
|
+static FILE *
|
|||
|
+open_makefile (char *filename)
|
|||
|
+{
|
|||
|
+ FILE *fp;
|
|||
|
+
|
|||
|
+#if HAVE_FDOPEN
|
|||
|
+ int fd = open (filename, O_RDONLY);
|
|||
|
+ int save;
|
|||
|
+ if (fd < 0)
|
|||
|
+ return NULL;
|
|||
|
+
|
|||
|
+ fp = fdopen (fd, "r");
|
|||
|
+ if (fp == NULL)
|
|||
|
+ {
|
|||
|
+ save = errno;
|
|||
|
+ close (fd);
|
|||
|
+ errno = save;
|
|||
|
+ return NULL;
|
|||
|
+ }
|
|||
|
+
|
|||
|
+ CLOSE_ON_EXEC (fd);
|
|||
|
+
|
|||
|
+#else
|
|||
|
+ fp = fopen (filename, "r");
|
|||
|
+#endif
|
|||
|
+
|
|||
|
+ return fp;
|
|||
|
+}
|
|||
|
+
|
|||
|
static int
|
|||
|
eval_makefile (char *filename, int flags)
|
|||
|
{
|
|||
|
@@ -335,7 +376,8 @@ eval_makefile (char *filename, int flags
|
|||
|
filename = expanded;
|
|||
|
}
|
|||
|
|
|||
|
- ebuf.fp = fopen (filename, "r");
|
|||
|
+ ebuf.fp = open_makefile (filename);
|
|||
|
+
|
|||
|
/* Save the error code so we print the right message later. */
|
|||
|
makefile_errno = errno;
|
|||
|
|
|||
|
@@ -348,7 +390,7 @@ eval_makefile (char *filename, int flags
|
|||
|
for (i = 0; include_directories[i] != 0; ++i)
|
|||
|
{
|
|||
|
included = concat (include_directories[i], "/", filename);
|
|||
|
- ebuf.fp = fopen (included, "r");
|
|||
|
+ ebuf.fp = open_makefile (included);
|
|||
|
if (ebuf.fp)
|
|||
|
{
|
|||
|
filename = included;
|