From: Zeev Suraski Date: Sun, 29 Oct 2000 23:10:04 +0000 (+0000) Subject: Fix leaks X-Git-Tag: php-4.0.4RC3~447 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3c06816532a0e3dce410304035be5d18ccc77976;p=php Fix leaks --- diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 49de05d519..a8c4687be6 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -152,6 +152,7 @@ static void ini_error(char *str) int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb, void *arg) { zend_ini_parser_param ini_parser_param; + int retval; ini_parser_param.ini_parser_cb = ini_parser_cb; ini_parser_param.arg = arg; @@ -159,7 +160,12 @@ int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb if (zend_ini_open_file_for_scanning(fh)==FAILURE) { return FAILURE; } - if (ini_parse(&ini_parser_param)==0) { + + retval = ini_parse(&ini_parser_param); + + zend_ini_close_file(fh); + + if (retval==0) { return SUCCESS; } else { return FAILURE; @@ -188,12 +194,14 @@ statement_list: statement: TC_STRING '=' string_or_value { #if DEBUG_CFG_PARSER - printf("'%s' = '%s'\n",$1.value.str.val,$3.value.str.val); + printf("'%s' = '%s'\n", $1.value.str.val, $3.value.str.val); #endif ZEND_INI_PARSER_CB(&$1, &$3, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); + free($1.value.str.val); + free($3.value.str.val); } - | TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); } - | SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG); } + | TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); free($1.value.str.val); } + | SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG); free($1.value.str.val); } | '\n' ; diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h index f83743f90f..9131216108 100644 --- a/Zend/zend_ini_scanner.h +++ b/Zend/zend_ini_scanner.h @@ -14,6 +14,7 @@ public: BEGIN_EXTERN_C() int zend_ini_scanner_get_lineno(); int zend_ini_open_file_for_scanning(zend_file_handle *fh); +void zend_ini_close_file(zend_file_handle *fh); int ini_lex(zval *ini_lval); END_EXTERN_C() diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index 48379e3485..830c6a1527 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -100,6 +100,7 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh) break; case ZEND_HANDLE_FILENAME: fp = zend_fopen(fh->filename, NULL); + fh->type = ZEND_HANDLE_FP; break; default: return FAILURE; @@ -122,6 +123,22 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh) return SUCCESS; } + +void zend_ini_close_file(zend_file_handle *fh) +{ + switch (fh->type) { + case ZEND_HANDLE_FP: + fclose(fh->handle.fp); + break; + case ZEND_HANDLE_STDIOSTREAM: { + CLS_FETCH(); + + delete CG(ini_scanner); + } + break; + } +} + %} %option noyywrap