]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Martin's fix for
authorMichael W. Hudson <mwh@python.net>
Mon, 18 Mar 2002 12:47:52 +0000 (12:47 +0000)
committerMichael W. Hudson <mwh@python.net>
Mon, 18 Mar 2002 12:47:52 +0000 (12:47 +0000)
[ 529104 ] broken error handling in unicode-escape

I presume this will need to be fixed on the trunk, too.

Later.

Objects/unicodeobject.c

index 95ba36116876958f03afd034a1ed98524233b124..5a8777b39643892d40428e84f6a3ad41d282a480 100644 (file)
@@ -1507,8 +1507,7 @@ PyObject *PyUnicode_AsUTF16String(PyObject *unicode)
 /* --- Unicode Escape Codec ----------------------------------------------- */
 
 static
-int unicodeescape_decoding_error(const char **source,
-                                 Py_UNICODE *x,
+int unicodeescape_decoding_error(Py_UNICODE **x,
                                  const char *errors,
                                  const char *details) 
 {
@@ -1523,7 +1522,8 @@ int unicodeescape_decoding_error(const char **source,
         return 0;
     }
     else if (strcmp(errors,"replace") == 0) {
-        *x = Py_UNICODE_REPLACEMENT_CHARACTER;
+        **x = Py_UNICODE_REPLACEMENT_CHARACTER;
+       (*x)++;
         return 0;
     }
     else {
@@ -1621,9 +1621,9 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
             for (i = 0; i < digits; i++) {
                 c = (unsigned char) s[i];
                 if (!isxdigit(c)) {
-                    if (unicodeescape_decoding_error(&s, &x, errors, message))
+                    if (unicodeescape_decoding_error(&p, errors, message))
                         goto onError;
-                    chr = x;
+                    chr = 0xffffffff;
                     i++;
                     break;
                 }
@@ -1636,6 +1636,10 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
                     chr += 10 + c - 'A';
             }
             s += i;
+           if (chr == 0xffffffff)
+                   /* _decoding_error will have already written into the
+                      target buffer. */
+                   break;
         store:
             /* when we get here, chr is a 32-bit unicode character */
             if (chr <= 0xffff)
@@ -1653,11 +1657,10 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
 #endif
             } else {
                 if (unicodeescape_decoding_error(
-                    &s, &x, errors,
+                    &p, errors,
                     "illegal Unicode character")
                     )
                     goto onError;
-                *p++ = x; /* store replacement character */
             }
             break;
 
@@ -1692,14 +1695,19 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
                         goto store;
                 }
             }
-            if (unicodeescape_decoding_error(&s, &x, errors, message))
+            if (unicodeescape_decoding_error(&p, errors, message))
                 goto onError;
-            *p++ = x;
             break;
 
         default:
-            *p++ = '\\';
-            *p++ = (unsigned char)s[-1];
+           if (s > end) {
+               if (unicodeescape_decoding_error(&p, errors, "\\ at end of string"))
+                   goto onError;
+           }
+           else {
+               *p++ = '\\';
+               *p++ = (unsigned char)s[-1];
+           }
             break;
         }
     }
@@ -1902,7 +1910,7 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
     end = s + size;
     while (s < end) {
        unsigned char c;
-       Py_UNICODE x;
+       Py_UCS4 x;
        int i;
 
        /* Non-escape characters are interpreted as Unicode ordinals */
@@ -1931,9 +1939,10 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
        for (x = 0, i = 0; i < 4; i++) {
            c = (unsigned char)s[i];
            if (!isxdigit(c)) {
-               if (unicodeescape_decoding_error(&s, &x, errors,
+               if (unicodeescape_decoding_error(&p, errors,
                                                 "truncated \\uXXXX"))
                    goto onError;
+               x = 0xffffffff;
                i++;
                break;
            }
@@ -1946,7 +1955,8 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
                x += 10 + c - 'A';
        }
        s += i;
-       *p++ = x;
+       if (x != 0xffffffff)
+               *p++ = x;
     }
     if (_PyUnicode_Resize(&v, (int)(p - buf)))
        goto onError;