From: Chip Salzenberg Date: Thu, 8 Feb 1996 19:18:24 +0000 (-0500) Subject: Beta3: Fix for FILE leak when "use" fails X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6d5fb7e35ca502ac3801c05dbefda75a40f233d0;p=p5sagit%2Fp5-mst-13.2.git Beta3: Fix for FILE leak when "use" fails This patch fixes a file leak triggered by "use" or "require" errors. I think it's of fairly high priority... --- diff --git a/toke.c b/toke.c index d24eee9..54c0919 100644 --- 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; {