Skip to content

Commit 7de1333

Browse files
author
Ilia Alshanetsky
committed
MFH: Fixed bug php#1580 (Tidy configuration settings leak memory).
1 parent c111b20 commit 7de1333

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

ext/tidy/tidy.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ static void *php_tidy_get_opt_val(TidyOption opt, TidyOptionType *type TSRMLS_DC
161161
static int _php_tidy_set_tidy_opt(char *optname, zval *value TSRMLS_DC)
162162
{
163163
TidyOption opt;
164+
zval conv = *value;
164165

165166
if (!(opt = tidyGetOptionByName(TG(tdoc)->doc, optname))) {
166167
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown Tidy Configuration Option '%s'", optname);
@@ -174,22 +175,37 @@ static int _php_tidy_set_tidy_opt(char *optname, zval *value TSRMLS_DC)
174175

175176
switch(tidyOptGetType(opt)) {
176177
case TidyString:
177-
convert_to_string_ex(&value);
178-
if (tidyOptSetValue(TG(tdoc)->doc, tidyOptGetId(opt), Z_STRVAL_P(value))) {
179-
return SUCCESS;
180-
}
178+
if (Z_TYPE(conv) != IS_STRING) {
179+
zval_copy_ctor(&conv);
180+
convert_to_string(&conv);
181+
}
182+
if (tidyOptSetValue(TG(tdoc)->doc, tidyOptGetId(opt), Z_STRVAL(conv))) {
183+
if (Z_TYPE(conv) != Z_TYPE_P(value)) {
184+
zval_dtor(&conv);
185+
}
186+
return SUCCESS;
187+
}
188+
if (Z_TYPE(conv) != Z_TYPE_P(value)) {
189+
zval_dtor(&conv);
190+
}
181191
break;
182192

183193
case TidyInteger:
184-
convert_to_long_ex(&value);
185-
if (tidyOptSetInt(TG(tdoc)->doc, tidyOptGetId(opt), Z_LVAL_P(value))) {
194+
if (Z_TYPE(conv) != IS_LONG) {
195+
zval_copy_ctor(&conv);
196+
convert_to_long(&conv);
197+
}
198+
if (tidyOptSetInt(TG(tdoc)->doc, tidyOptGetId(opt), Z_LVAL(conv))) {
186199
return SUCCESS;
187200
}
188201
break;
189202

190203
case TidyBoolean:
191-
convert_to_long_ex(&value);
192-
if (tidyOptSetBool(TG(tdoc)->doc, tidyOptGetId(opt), Z_LVAL_P(value))) {
204+
if (Z_TYPE(conv) != IS_LONG) {
205+
zval_copy_ctor(&conv);
206+
convert_to_long(&conv);
207+
}
208+
if (tidyOptSetBool(TG(tdoc)->doc, tidyOptGetId(opt), Z_LVAL(conv))) {
193209
return SUCCESS;
194210
}
195211
break;
@@ -198,7 +214,7 @@ static int _php_tidy_set_tidy_opt(char *optname, zval *value TSRMLS_DC)
198214
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option");
199215
break;
200216
}
201-
217+
202218
return FAILURE;
203219
}
204220

0 commit comments

Comments
 (0)