ext/tidy: tidyOptGetType returns an enum that is fully checked

This commit is contained in:
Gina Peter Banyard 2025-07-18 03:39:51 +01:00
parent aadd724362
commit 01dbee83e1

View file

@ -219,7 +219,6 @@ static zend_result php_tidy_apply_config(TidyDoc doc, const zend_string *str_str
static zend_result _php_tidy_set_tidy_opt(TidyDoc doc, const char *optname, zval *value, uint32_t arg) static zend_result _php_tidy_set_tidy_opt(TidyDoc doc, const char *optname, zval *value, uint32_t arg)
{ {
TidyOption opt = tidyGetOptionByName(doc, optname); TidyOption opt = tidyGetOptionByName(doc, optname);
zend_string *str, *tmp_str;
zend_long lval; zend_long lval;
if (!opt) { if (!opt) {
@ -236,36 +235,21 @@ static zend_result _php_tidy_set_tidy_opt(TidyDoc doc, const char *optname, zval
return FAILURE; return FAILURE;
} }
switch(tidyOptGetType(opt)) { TidyOptionType type = tidyOptGetType(opt);
case TidyString: if (type == TidyString) {
str = zval_get_tmp_string(value, &tmp_str); zend_string *tmp_str;
if (tidyOptSetValue(doc, tidyOptGetId(opt), ZSTR_VAL(str))) { const zend_string *str = zval_get_tmp_string(value, &tmp_str);
const bool result = tidyOptSetValue(doc, tidyOptGetId(opt), ZSTR_VAL(str));
zend_tmp_string_release(tmp_str); zend_tmp_string_release(tmp_str);
return SUCCESS; return result ? SUCCESS : FAILURE;
} } else if (type == TidyInteger) {
zend_tmp_string_release(tmp_str);
break;
case TidyInteger:
lval = zval_get_long(value); lval = zval_get_long(value);
if (tidyOptSetInt(doc, tidyOptGetId(opt), lval)) { return tidyOptSetInt(doc, tidyOptGetId(opt), lval) ? SUCCESS : FAILURE;
return SUCCESS; } else {
} ZEND_ASSERT(type == TidyBoolean);
break;
case TidyBoolean:
lval = zval_get_long(value); lval = zval_get_long(value);
if (tidyOptSetBool(doc, tidyOptGetId(opt), lval)) { return tidyOptSetBool(doc, tidyOptGetId(opt), lval) ? SUCCESS : FAILURE;
return SUCCESS;
} }
break;
default:
php_error_docref(NULL, E_WARNING, "Unable to determine type of configuration option");
break;
}
return FAILURE;
} }
static void tidy_create_node_object(zval *zv, PHPTidyDoc *ptdoc, TidyNode node) static void tidy_create_node_object(zval *zv, PHPTidyDoc *ptdoc, TidyNode node)
@ -720,28 +704,19 @@ static void *php_tidy_get_opt_val(const PHPTidyDoc *ptdoc, TidyOption opt, TidyO
{ {
*type = tidyOptGetType(opt); *type = tidyOptGetType(opt);
switch (*type) { if (*type == TidyString) {
case TidyString: {
const char *val = tidyOptGetValue(ptdoc->doc, tidyOptGetId(opt)); const char *val = tidyOptGetValue(ptdoc->doc, tidyOptGetId(opt));
if (val) { if (val) {
return (void *) zend_string_init(val, strlen(val), 0); return (void *) zend_string_init(val, strlen(val), 0);
} else { } else {
return (void *) ZSTR_EMPTY_ALLOC(); return (void *) ZSTR_EMPTY_ALLOC();
} }
} } else if (*type == TidyInteger) {
break;
case TidyInteger:
return (void *) (uintptr_t) tidyOptGetInt(ptdoc->doc, tidyOptGetId(opt)); return (void *) (uintptr_t) tidyOptGetInt(ptdoc->doc, tidyOptGetId(opt));
break; } else {
ZEND_ASSERT(*type == TidyBoolean);
case TidyBoolean:
return (void *) tidyOptGetBool(ptdoc->doc, tidyOptGetId(opt)); return (void *) tidyOptGetBool(ptdoc->doc, tidyOptGetId(opt));
break;
} }
/* should not happen */
return NULL;
} }
static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node_type) static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node_type)
@ -1322,18 +1297,10 @@ PHP_FUNCTION(tidy_getopt)
case TidyInteger: case TidyInteger:
RETURN_LONG((zend_long)optval); RETURN_LONG((zend_long)optval);
break;
case TidyBoolean: case TidyBoolean:
RETURN_BOOL(optval); RETURN_BOOL(optval);
break;
default:
php_error_docref(NULL, E_WARNING, "Unable to determine type of configuration option");
break;
} }
RETURN_FALSE;
} }
/* }}} */ /* }}} */