]> granicus.if.org Git - python/commitdiff
Overallocate target buffer for normalization more early. Fixes #834676.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 6 Nov 2003 20:47:57 +0000 (20:47 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 6 Nov 2003 20:47:57 +0000 (20:47 +0000)
Backported to 2.3.

Lib/test/test_normalization.py
Modules/unicodedata.c

index 046dca6c851bd9e06804ed6710f173dee5e02071..0cbc2b49e9fb4ba2594afc877e7d0f46e9e8aafe 100644 (file)
@@ -84,5 +84,8 @@ def test_main():
             continue
         assert X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c
 
+    # Check for bug 834676
+    normalize('NFC',u'\ud55c\uae00')
+
 if __name__ == "__main__":
     test_main()
index d266ad7e0b49b8a98ad3455c2744e979d1e3b7a2..311db296bdbcecacdef9c44e98be8ae79ef45fe1 100644 (file)
@@ -311,12 +311,14 @@ nfd_nfkd(PyObject *input, int k)
         stack[stackptr++] = *i++;
         while(stackptr) {
             Py_UNICODE code = stack[--stackptr];
-            if (!space) {
-                space = PyString_GET_SIZE(result) + 10;
-                if (PyUnicode_Resize(&result, space) == -1)
+            /* Hangul Decomposition adds three characters in
+               a single step, so we need atleast that much room. */
+            if (space < 3) {
+                int newsize = PyString_GET_SIZE(result) + 10;
+                space += 10;
+                if (PyUnicode_Resize(&result, newsize) == -1)
                     return NULL;
-                o = PyUnicode_AS_UNICODE(result) + space - 10;
-                space = 10;
+                o = PyUnicode_AS_UNICODE(result) + newsize - space;
             }
             /* Hangul Decomposition. */
             if (SBase <= code && code < (SBase+SCount)) {