bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bison patches to avoid rare misuses of file descriptors


From: Paul Eggert
Subject: Bison patches to avoid rare misuses of file descriptors
Date: Sun, 22 May 2005 08:13:03 -0000

I installed this.  It requires a re-bootstrap.

2005-05-22  Paul Eggert  <address@hidden>

        * bootstrap: Add stdio-safer, unistd-safer modules.
        Remove m4/glibc2.m4 (introduced by latest gnulib, but
        we don't need it).
        * lib/.cvsignore: Add dup-safer.c, fd-safer.c,
        fopen-safer.c, stdio-safer.h, unistd-safer.h.
        * lib/subpipe.c: Include "unistd-safer.h".
        (create_subpipe): Make sure all the newly-created
        file descriptors are > 2, so that diagnostics don't
        get sent down them (which might cause Bison to hang, in theory).
        * m4/.cvsignore: Add stdio-safer.m4, unistd-safer.m4.
        * src/files.c (xfopen): Use fopen_safer, not fopen.

Index: bootstrap
===================================================================
RCS file: /cvsroot/bison/bison/bootstrap,v
retrieving revision 1.17
diff -p -u -r1.17 bootstrap
--- bootstrap   14 May 2005 06:49:46 -0000      1.17
+++ bootstrap   22 May 2005 07:50:24 -0000
@@ -105,7 +105,9 @@ obstack
 quote
 quotearg
 stdbool
+stdio-safer
 stpcpy
+unistd-safer
 xalloc
 xalloc-die
 xstrndup
@@ -197,6 +199,7 @@ intl_files_to_remove='
   intl
   m4/codeset.m4
   m4/gettext.m4
+  m4/glibc2.m4
   m4/glibc21.m4
   m4/intdiv0.m4
   m4/intmax.m4
Index: lib/.cvsignore
===================================================================
RCS file: /cvsroot/bison/bison/lib/.cvsignore,v
retrieving revision 1.12
diff -p -u -r1.12 .cvsignore
--- lib/.cvsignore      9 Dec 2004 07:54:47 -0000       1.12
+++ lib/.cvsignore      22 May 2005 07:50:24 -0000
@@ -9,11 +9,14 @@ argmatch.h
 basename.c
 dirname.c
 dirname.h
+dup-safer.c
 error.c
 error.h
 exit.h
 exitfail.c
 exitfail.h
+fd-safer.c
+fopen-safer.c
 getopt.c
 getopt.h
 getopt1.c
@@ -37,6 +40,7 @@ quotearg.h
 realloc.c
 stdbool.h
 stdbool_.h
+stdio-safer.h
 stpcpy.c
 stpcpy.h
 strdup.c
@@ -46,6 +50,7 @@ strncasecmp.c
 strndup.c
 strndup.h
 strnlen.c
+unistd-safer.h
 unlocked-io.h
 xalloc-die.c
 xalloc.h
Index: lib/subpipe.c
===================================================================
RCS file: /cvsroot/bison/bison/lib/subpipe.c,v
retrieving revision 1.3
diff -p -u -r1.3 subpipe.c
--- lib/subpipe.c       14 May 2005 06:49:47 -0000      1.3
+++ lib/subpipe.c       22 May 2005 07:50:24 -0000
@@ -1,6 +1,6 @@
 /* Subprocesses with pipes.
 
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -68,6 +68,7 @@
 #endif
 
 #include "error.h"
+#include "unistd-safer.h"
 
 #include "gettext.h"
 #define _(Msgid)  gettext (Msgid)
@@ -105,15 +106,13 @@ create_subpipe (char const * const *argv
   int to_out_fd;
   pid_t pid;
 
-  if (pipe (pipe_fd) != 0)
+  if (pipe (pipe_fd) != 0
+      || (to_in_fd = fd_safer (pipe_fd[0])) < 0
+      || (to_out_fd = fd_safer (pipe_fd[1])) < 0
+      || pipe (pipe_fd) != 0
+      || (from_in_fd = fd_safer (pipe_fd[0])) < 0
+      || (from_out_fd = fd_safer (pipe_fd[1])) < 0)
     error (EXIT_FAILURE, errno, "pipe");
-  to_in_fd = pipe_fd[0];
-  to_out_fd = pipe_fd[1];
-
-  if (pipe (pipe_fd) != 0)
-    error (EXIT_FAILURE, errno, "pipe");
-  from_in_fd = pipe_fd[0];
-  from_out_fd = pipe_fd[1];
 
   pid = vfork ();
   if (pid < 0)
@@ -124,23 +123,16 @@ create_subpipe (char const * const *argv
       /* Child.  */
       close (to_out_fd);
       close (from_in_fd);
-
-      if (to_in_fd != STDIN_FILENO)
-       {
-         dup2 (to_in_fd, STDIN_FILENO);
-         close (to_in_fd);
-       }
-      if (from_out_fd != STDOUT_FILENO)
-       {
-         dup2 (from_out_fd, STDOUT_FILENO);
-         close (from_out_fd);
-       }
+      dup2 (to_in_fd, STDIN_FILENO);
+      close (to_in_fd);
+      dup2 (from_out_fd, STDOUT_FILENO);
+      close (from_out_fd);
 
       /* The cast to (char **) rather than (char * const *) is needed
         for portability to older hosts with a nonstandard prototype
         for execvp.  */
       execvp (argv[0], (char **) argv);
-    
+
       _exit (errno == ENOENT ? 127 : 126);
     }
 
Index: m4/.cvsignore
===================================================================
RCS file: /cvsroot/bison/bison/m4/.cvsignore,v
retrieving revision 1.11
diff -p -u -r1.11 .cvsignore
--- m4/.cvsignore       9 Dec 2004 07:55:04 -0000       1.11
+++ m4/.cvsignore       22 May 2005 07:50:24 -0000
@@ -26,11 +26,13 @@ progtest.m4
 quote.m4
 quotearg.m4
 stdbool.m4
+stdio-safer.m4
 stpcpy.m4
 strdup.m4
 strerror_r.m4
 strndup.m4
 strnlen.m4
+unistd-safer.m4
 unlocked-io.m4
 xalloc.m4
 xstrndup.m4
Index: src/files.c
===================================================================
RCS file: /cvsroot/bison/bison/src/files.c,v
retrieving revision 1.87
diff -p -u -r1.87 files.c
--- src/files.c 14 May 2005 06:49:47 -0000      1.87
+++ src/files.c 22 May 2005 07:50:24 -0000
@@ -1,6 +1,6 @@
 /* Open and close files for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -95,7 +95,7 @@ xfopen (const char *name, const char *mo
 {
   FILE *ptr;
 
-  ptr = fopen (name, mode);
+  ptr = fopen_safer (name, mode);
   if (!ptr)
     error (EXIT_FAILURE, get_errno (), _("cannot open file `%s'"), name);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]