]> granicus.if.org Git - php/commitdiff
Fixed bug #1580 (Tidy configuration settings leak memory).
authorIlia Alshanetsky <iliaa@php.net>
Tue, 8 Jun 2004 14:55:14 +0000 (14:55 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 8 Jun 2004 14:55:14 +0000 (14:55 +0000)
ext/tidy/tidy.c

index 7a089af1c0e91682deb45ade31a8399d10489d87..980ffec2e323b1413066b54272d5672a07ccecc3 100644 (file)
@@ -330,39 +330,52 @@ void php_tidy_panic(ctmbstr msg)
 
 static int _php_tidy_set_tidy_opt(TidyDoc doc, char *optname, zval *value TSRMLS_DC)
 {
-       TidyOption opt;
-       
-       opt = tidyGetOptionByName(doc, optname);
+       TidyOption opt = tidyGetOptionByName(doc, optname);
+       zval conv = *value;
 
        if (!opt) {
-        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown Tidy Configuration Option '%s'", optname);
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown Tidy Configuration Option '%s'", optname);
                return FAILURE;
        }
        
        if (tidyOptIsReadOnly(opt)) {
-        
-        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Attempting to set read-only option '%s'", optname);
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Attempting to set read-only option '%s'", optname);
                return FAILURE;
        }
 
        switch(tidyOptGetType(opt)) {
                case TidyString:
-                       convert_to_string_ex(&value);
-                       if (tidyOptSetValue(doc, tidyOptGetId(opt), Z_STRVAL_P(value))) {
+                       if (Z_TYPE(conv) != IS_STRING) {
+                               zval_copy_ctor(&conv);
+                               convert_to_string(&conv);
+                       }
+                       if (tidyOptSetValue(doc, tidyOptGetId(opt), Z_STRVAL(conv))) {
+                               if (Z_TYPE(conv) != Z_TYPE_P(value)) {
+                                       zval_dtor(&conv);
+                               }
                                return SUCCESS;
                        }
+                       if (Z_TYPE(conv) != Z_TYPE_P(value)) {
+                               zval_dtor(&conv);
+                       }
                        break;
 
                case TidyInteger:
-                       convert_to_long_ex(&value);
-                       if (tidyOptSetInt(doc, tidyOptGetId(opt), Z_LVAL_P(value))) {
+                       if (Z_TYPE(conv) != IS_LONG) {
+                               zval_copy_ctor(&conv);
+                               convert_to_long(&conv);
+                       }
+                       if (tidyOptSetInt(doc, tidyOptGetId(opt), Z_LVAL(conv))) {
                                return SUCCESS;
                        }
                        break;
 
                case TidyBoolean:
-                       convert_to_long_ex(&value);
-                       if (tidyOptSetBool(doc,  tidyOptGetId(opt), Z_LVAL_P(value))) {
+                       if (Z_TYPE(conv) != IS_LONG) {
+                               zval_copy_ctor(&conv);
+                               convert_to_long(&conv);
+                       }
+                       if (tidyOptSetBool(doc,  tidyOptGetId(opt), Z_LVAL(conv))) {
                                return SUCCESS;
                        }
                        break;
@@ -371,7 +384,7 @@ static int _php_tidy_set_tidy_opt(TidyDoc doc, char *optname, zval *value TSRMLS
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option");
                        break;
        }       
-       
+
        return FAILURE;
 }