]> granicus.if.org Git - php/commitdiff
Use nicer output for characters < 32 and > 126 in exception strings
authorBob Weinand <bobwei9@hotmail.com>
Thu, 20 Feb 2014 16:39:58 +0000 (17:39 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 20 Feb 2014 16:39:58 +0000 (17:39 +0100)
Using question marks might confuse more than it helps.
Users are wondering what happened to their string...

Zend/zend_exceptions.c

index 2ef74ad106ff8ce7fc317b923ebfac9801133608..ced1ebf639701f7c199461cd46ab7adc0794d0db 100644 (file)
@@ -360,6 +360,11 @@ ZEND_METHOD(error_exception, getSeverity)
                }                                                               \
        }
 
+
+#define TRACE_ARG_APPEND(vallen)                                                               \
+       *str = (char*)erealloc(*str, *len + 1 + vallen);                                        \
+       memcpy((*str) + *len - l_added + 1 + vallen, (*str) + *len - l_added + 1, l_added);
+
 /* }}} */
 
 static int _build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
@@ -371,7 +376,7 @@ static int _build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, z
        len = va_arg(args, int*);
 
        /* the trivial way would be to do:
-        * conver_to_string_ex(arg);
+        * convert_to_string_ex(arg);
         * append it and kill the now tmp arg.
         * but that could cause some E_NOTICE and also damn long lines.
         */
@@ -394,8 +399,58 @@ static int _build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, z
                                l_added += 3 + 1;
                        }
                        while (--l_added) {
-                               if ((*str)[*len - l_added] < 32) {
-                                       (*str)[*len - l_added] = '?';
+                               unsigned char chr = (*str)[*len - l_added];
+                               if (chr < 32 || chr == '\\' || chr > 126) {
+                                       (*str)[*len - l_added] = '\\';
+
+                                       switch (chr) {
+                                               case '\n':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 'n';
+                                                       break;
+                                               case '\r':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 'r';
+                                                       break;
+                                               case '\t':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 't';
+                                                       break;
+                                               case '\f':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 'f';
+                                                       break;
+                                               case '\v':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 'v';
+                                                       break;
+#ifndef PHP_WIN32
+                                               case '\e':
+#else
+                                               case VK_ESCAPE:
+#endif
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = 'e';
+                                                       break;
+                                               case '\\':
+                                                       TRACE_ARG_APPEND(1);
+                                                       (*str)[++(*len) - l_added] = '\\';
+                                                       break;
+                                               default:
+                                                       TRACE_ARG_APPEND(3);
+                                                       (*str)[*len - l_added + 1] = 'x';
+                                                       if ((chr >> 4) < 10) {
+                                                               (*str)[*len - l_added + 2] = (chr >> 4) + '0';
+                                                       } else {
+                                                               (*str)[*len - l_added + 2] = (chr >> 4) + 'A' - 10;
+                                                       }
+                                                       if (chr % 16 < 10) {
+                                                               (*str)[*len - l_added + 3] = chr % 16 + '0';
+                                                       } else {
+                                                               (*str)[*len - l_added + 3] = chr % 16 + 'A' - 10;
+                                                       }
+                                                       *len += 3;
+                                       }
                                }
                        }
                        break;