From 49fb6260b672832acfbb7e2f873633c12d500886 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Tue, 8 Jun 2004 14:55:14 +0000 Subject: [PATCH] Fixed bug #1580 (Tidy configuration settings leak memory). --- ext/tidy/tidy.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index 7a089af1c0..980ffec2e3 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -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; } -- 2.40.0