diff --git a/NEWS b/NEWS
index 77dd9b23d3e..9c24c6204ae 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 65e703d5d21..8354f87ace9 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 00000000000..4069c9f6be4
--- /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