From: Dmitry Stogov Date: Wed, 5 Sep 2007 10:18:23 +0000 (+0000) Subject: Fixed bug #42488 (SoapServer reports an encoding error and the error itself breaks). X-Git-Tag: php-5.2.5RC1~217 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee944bd1b5fa22f003805f760e63fa94fec0c487;p=php Fixed bug #42488 (SoapServer reports an encoding error and the error itself breaks). --- diff --git a/NEWS b/NEWS index 77dd9b23d3..9c24c6204a 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,8 @@ PHP NEWS (Hannes) - Fixed bug #42468 (Write lock on file_get_contents fails when using a compression stream). (Ilia) +- Fixed bug #42488 (SoapServer reports an encoding error and the error itself + breaks). (Dmitry) - Fixed bug #42359 (xsd:list type not parsed). (Dmitry) - Fixed bug #42326 (SoapServer crash). (Dmitry) - Fixed bug #42086 (SoapServer return Procedure '' not present for WSIBasic diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 65e703d5d2..8354f87ace 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -864,13 +864,50 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo efree(str); str = estrdup((char*)xmlBufferContent(out)); new_len = n; - } else if (!php_libxml_xmlCheckUTF8(BAD_CAST(str))) { - soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str); } xmlBufferFree(out); xmlBufferFree(in); - } else if (!php_libxml_xmlCheckUTF8(BAD_CAST(str))) { - soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str); + } + + if (!php_libxml_xmlCheckUTF8(BAD_CAST(str))) { + char *err = emalloc(new_len + 8); + char c; + int i; + + memcpy(err, str, new_len+1); + for (i = 0; (c = err[i++]);) { + if ((c & 0x80) == 0) { + } else if ((c & 0xe0) == 0xc0) { + if ((err[i] & 0xc0) != 0x80) { + break; + } + i++; + } else if ((c & 0xf0) == 0xe0) { + if ((err[i] & 0xc0) != 0x80 || (err[i+1] & 0xc0) != 0x80) { + break; + } + i += 2; + } else if ((c & 0xf8) == 0xf0) { + if ((err[i] & 0xc0) != 0x80 || (err[i+1] & 0xc0) != 0x80 || (err[i+2] & 0xc0) != 0x80) { + break; + } + i += 3; + } else { + break; + } + } + if (c) { + err[i-1] = '\\'; + err[i++] = 'x'; + err[i++] = ((unsigned char)c >> 4) + ((((unsigned char)c >> 4) > 9) ? ('a' - 10) : '0'); + err[i++] = (c & 15) + (((c & 15) > 9) ? ('a' - 10) : '0'); + err[i++] = '.'; + err[i++] = '.'; + err[i++] = '.'; + err[i++] = 0; + } + + soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", err); } text = xmlNewTextLen(BAD_CAST(str), new_len); diff --git a/ext/soap/tests/bugs/bug42488.phpt b/ext/soap/tests/bugs/bug42488.phpt new file mode 100755 index 0000000000..4069c9f6be --- /dev/null +++ b/ext/soap/tests/bugs/bug42488.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #42488 (SoapServer reports an encoding error and the error itself breaks) +--SKIPIF-- + +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + +EOF; +$soap = new SoapServer(NULL, array('uri'=>'test://')); +function getBadUTF(){ + return "stuff\x93thing"; +} +$soap->addFunction('getBadUTF'); +$soap->handle($request); +?> +--EXPECT-- + +SOAP-ENV:ServerSOAP-ERROR: Encoding: string 'stuff\x93...' is not a valid utf-8 string \ No newline at end of file