]> granicus.if.org Git - php/commitdiff
Fix leaks
authorZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 23:10:04 +0000 (23:10 +0000)
committerZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 23:10:04 +0000 (23:10 +0000)
Zend/zend_ini_parser.y
Zend/zend_ini_scanner.h
Zend/zend_ini_scanner.l

index 49de05d519e92f3c580eed20dd57f8a123f33b73..a8c4687be69c92b3442d7f57f160a6fe14bf0035 100644 (file)
@@ -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'
 ;
 
index f83743f90f230bd931738c63063f8b2cedf69e68..9131216108aeb75e619763d87b2e587458842f20 100644 (file)
@@ -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()
 
index 48379e34851b6c7b4e15dfb0d5cb4a5ab26e5610..830c6a152727b84e1006638691d03574aed768ec 100644 (file)
@@ -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