preprocessor/556: cpplib uses freed file descriptors

Neil Booth NeilB@earthling.net
Tue Sep 19 23:28:00 GMT 2000


This fixes this bug.  I'm not really sure what semantics Zack had in
mind for file caching, so I cannot claim this is the "right (tm)" fix.

The code was assuming that a file found in the splay tree, that had
been purged from cache, had a valid file descriptor.  This isn't the
case, so I faced the choice of removing purged caches from the splay
tree, or adding a bunch of checks.  I opted for the former.

If this completes a bootstrap / testsuite cycle, I'll commit it and
the testcase.

Neil.

	* cppfiles.c (_cpp_pop_file_buffer): Remove purged caches
	from the splay tree to force a re-open if necessary later.
	* gcc.gd/cpp/mi4.c: A testcase.

Index: cppfiles.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cppfiles.c,v
retrieving revision 1.81
diff -u -p -r1.81 cppfiles.c
--- cppfiles.c	2000/09/19 17:28:46	1.81
+++ cppfiles.c	2000/09/20 06:10:27
@@ -735,7 +735,8 @@ _cpp_pop_file_buffer (pfile, buf)
 
   inc->refcnt--;
   if (inc->refcnt == 0 && DO_NOT_REREAD (inc))
-    purge_cache (inc);
+    splay_tree_remove (pfile->all_include_files,
+		       (splay_tree_key) inc->name);
 }
 
 /* The file_name_map structure holds a mapping of file names for a
Index: testsuite/gcc.dg/cpp/mi4.c
===================================================================
RCS file: mi4.c
diff -N mi4.c
--- /dev/null	Tue May  5 13:32:27 1998
+++ mi4.c	Tue Sep 19 23:10:41 2000
@@ -0,0 +1,10 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+
+/* Undefining a macro guard and re-including the file used to confuse
+   file caching in cppfiles.c, and attempt to open a bad fd.  */
+
+#include "mi1c.h"
+#undef CPP_MIC_H
+#include "mi1c.h"


More information about the Gcc-bugs mailing list