Beta3: Fix for FILE leak when "use" fails
Chip Salzenberg [Thu, 8 Feb 1996 19:18:24 +0000 (14:18 -0500)]
This patch fixes a file leak triggered by "use" or "require" errors.
I think it's of fairly high priority...

toke.c

diff --git a/toke.c b/toke.c
index d24eee9..54c0919 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -44,6 +44,7 @@ static I32 sublex_start _((void));
 static int uni _((I32 f, char *s));
 #endif
 static char * filter_gets _((SV *sv, FILE *fp));
+static void restore_rsfp _((void *f));
 
 /* The following are arranged oddly so that the guard on the switch statement
  * can get by with a single comparison (if the compiler is smart enough).
@@ -222,7 +223,7 @@ SV *line;
     SAVESPTR(linestr);
     SAVEPPTR(lex_brackstack);
     SAVEPPTR(lex_casestack);
-    SAVESPTR(rsfp);
+    SAVEDESTRUCTOR(restore_rsfp, rsfp);
 
     lex_state = LEX_NORMAL;
     lex_defer = 0;
@@ -268,6 +269,19 @@ lex_end()
 }
 
 static void
+restore_rsfp(f)
+void *f;
+{
+    FILE *fp = (FILE*)f;
+
+    if (rsfp == stdin)
+       clearerr(rsfp);
+    else if (rsfp != fp)
+       fclose(rsfp);
+    rsfp = fp;
+}
+
+static void
 incline(s)
 char *s;
 {