From 1a011a649f7ce6e3a1caa7b1e249c60fe3de8e20 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 29 May 2025 12:04:57 +0100 Subject: [PATCH 1/3] ext/soap: Refactor to_zval_bool() - Early return style - Improve logic to get rid of unnecessary comparisons and calls to stricmp() - Do not use convert_to_boolean API --- ext/soap/php_encoding.c | 50 ++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 67543259994f3..47a0f949fe882 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1134,29 +1134,43 @@ static xmlNodePtr to_xml_double(encodeTypePtr type, zval *data, int style, xmlNo static zval *to_zval_bool(zval *ret, encodeTypePtr type, xmlNodePtr data) { - ZVAL_NULL(ret); FIND_XML_NULL(data, ret); - if (data && data->children) { - if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) { - whiteSpace_collapse(data->children->content); - if (stricmp((char*)data->children->content, "true") == 0 || - stricmp((char*)data->children->content, "t") == 0 || - strcmp((char*)data->children->content, "1") == 0) { - ZVAL_TRUE(ret); - } else if (stricmp((char*)data->children->content, "false") == 0 || - stricmp((char*)data->children->content, "f") == 0 || - strcmp((char*)data->children->content, "0") == 0) { + if (!data || !data->children) { + ZVAL_NULL(ret); + return ret; + } + if (data->children->type != XML_TEXT_NODE || data->children->next != NULL) { + // TODO Convert to exception? + soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); + } + + whiteSpace_collapse(data->children->content); + size_t len = strlen((const char*)data->children->content); + if (len == 0) { + ZVAL_FALSE(ret); + } else if (len == 1) { + switch (data->children->content[0]) { + case 'f': + case 'F': + case '0': ZVAL_FALSE(ret); - } else { - ZVAL_STRING(ret, (char*)data->children->content); - convert_to_boolean(ret); - } - } else { - soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); + break; + default: + ZVAL_TRUE(ret); + break; } + } else if ( + len == 5 + && (data->children->content[0] == 'f' || data->children->content[0] == 'F') + && (data->children->content[1] == 'a' || data->children->content[1] == 'A') + && (data->children->content[2] == 'l' || data->children->content[2] == 'L') + && (data->children->content[3] == 's' || data->children->content[3] == 'S') + && (data->children->content[4] == 'e' || data->children->content[4] == 'E') + ) { + ZVAL_FALSE(ret); } else { - ZVAL_NULL(ret); + ZVAL_TRUE(ret); } return ret; } From cdb96b3fdc022207fbedb5a5b68ec74e54aa2f49 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 29 May 2025 14:59:24 +0100 Subject: [PATCH 2/3] Review comments --- ext/soap/php_encoding.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 47a0f949fe882..c591258f32d61 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1136,7 +1136,7 @@ static zval *to_zval_bool(zval *ret, encodeTypePtr type, xmlNodePtr data) { FIND_XML_NULL(data, ret); - if (!data || !data->children) { + if (!data->children) { ZVAL_NULL(ret); return ret; } @@ -1146,27 +1146,11 @@ static zval *to_zval_bool(zval *ret, encodeTypePtr type, xmlNodePtr data) } whiteSpace_collapse(data->children->content); - size_t len = strlen((const char*)data->children->content); - if (len == 0) { - ZVAL_FALSE(ret); - } else if (len == 1) { - switch (data->children->content[0]) { - case 'f': - case 'F': - case '0': - ZVAL_FALSE(ret); - break; - default: - ZVAL_TRUE(ret); - break; - } - } else if ( - len == 5 - && (data->children->content[0] == 'f' || data->children->content[0] == 'F') - && (data->children->content[1] == 'a' || data->children->content[1] == 'A') - && (data->children->content[2] == 'l' || data->children->content[2] == 'L') - && (data->children->content[3] == 's' || data->children->content[3] == 'S') - && (data->children->content[4] == 'e' || data->children->content[4] == 'E') + if ( + data->children->content[0] == '\0' /* Check for empty string */ + || strcmp((const char*)data->children->content, "0") == 0 + || strcmp((const char*)data->children->content, "f") == 0 + || strcmp((const char*)data->children->content, "false") == 0 ) { ZVAL_FALSE(ret); } else { From f71dd2b05603389060b044b39836f8cbac72a94b Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 29 May 2025 15:06:08 +0100 Subject: [PATCH 3/3] use stricmp I blame copy paste --- ext/soap/php_encoding.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index c591258f32d61..c179f89020063 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1149,8 +1149,8 @@ static zval *to_zval_bool(zval *ret, encodeTypePtr type, xmlNodePtr data) if ( data->children->content[0] == '\0' /* Check for empty string */ || strcmp((const char*)data->children->content, "0") == 0 - || strcmp((const char*)data->children->content, "f") == 0 - || strcmp((const char*)data->children->content, "false") == 0 + || stricmp((const char*)data->children->content, "f") == 0 + || stricmp((const char*)data->children->content, "false") == 0 ) { ZVAL_FALSE(ret); } else {