[Python-checkins] python/dist/src/Objects unicodeobject.c, 2.190.6.8, 2.190.6.9
Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1:/tmp/cvs-serv28564/Objects Modified Files: Tag: release23-maint unicodeobject.c Log Message: Backport checkin: Fix a bug in the memory reallocation code of PyUnicode_TranslateCharmap(). charmaptranslate_makespace() allocates more memory than required for the next replacement but didn't remember that fact, so memory size was growing exponentially every time a replacement string is longer that one character. This fixes SF bug #828737. Index: unicodeobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/unicodeobject.c,v retrieving revision 2.190.6.8 retrieving revision 2.190.6.9 diff -C2 -d -r2.190.6.8 -r2.190.6.9 *** unicodeobject.c 18 Oct 2003 09:54:38 -0000 2.190.6.8 --- unicodeobject.c 24 Oct 2003 15:05:29 -0000 2.190.6.9 *************** *** 3224,3240 **** Return 0 on success, -1 on error */ static ! int charmaptranslate_makespace(PyObject **outobj, Py_UNICODE **outp, int *outsize, int requiredsize) { ! if (requiredsize > *outsize) { /* remember old output position */ int outpos = *outp-PyUnicode_AS_UNICODE(*outobj); /* exponentially overallocate to minimize reallocations */ ! if (requiredsize < 2 * *outsize) ! requiredsize = 2 * *outsize; if (_PyUnicode_Resize(outobj, requiredsize)) return -1; *outp = PyUnicode_AS_UNICODE(*outobj) + outpos; - *outsize = requiredsize; } return 0; --- 3224,3240 ---- Return 0 on success, -1 on error */ static ! int charmaptranslate_makespace(PyObject **outobj, Py_UNICODE **outp, int requiredsize) { ! int oldsize = PyUnicode_GET_SIZE(*outobj); ! if (requiredsize > oldsize) { /* remember old output position */ int outpos = *outp-PyUnicode_AS_UNICODE(*outobj); /* exponentially overallocate to minimize reallocations */ ! if (requiredsize < 2 * oldsize) ! requiredsize = 2 * oldsize; if (_PyUnicode_Resize(outobj, requiredsize)) return -1; *outp = PyUnicode_AS_UNICODE(*outobj) + outpos; } return 0; *************** *** 3247,3258 **** Return 0 on success, -1 on error. */ static ! int charmaptranslate_output(Py_UNICODE c, PyObject *mapping, ! PyObject **outobj, int *outsize, Py_UNICODE **outp, PyObject **res) { ! if (charmaptranslate_lookup(c, mapping, res)) return -1; if (*res==NULL) { /* not found => default to 1:1 mapping */ ! *(*outp)++ = (Py_UNICODE)c; } else if (*res==Py_None) --- 3247,3259 ---- Return 0 on success, -1 on error. */ static ! int charmaptranslate_output(const Py_UNICODE *startinp, const Py_UNICODE *curinp, ! int insize, PyObject *mapping, PyObject **outobj, Py_UNICODE **outp, ! PyObject **res) { ! if (charmaptranslate_lookup(*curinp, mapping, res)) return -1; if (*res==NULL) { /* not found => default to 1:1 mapping */ ! *(*outp)++ = *curinp; } else if (*res==Py_None) *************** *** 3270,3275 **** else if (repsize!=0) { /* more than one character */ ! int requiredsize = *outsize + repsize - 1; ! if (charmaptranslate_makespace(outobj, outp, outsize, requiredsize)) return -1; memcpy(*outp, PyUnicode_AS_UNICODE(*res), sizeof(Py_UNICODE)*repsize); --- 3271,3278 ---- else if (repsize!=0) { /* more than one character */ ! int requiredsize = (*outp-PyUnicode_AS_UNICODE(*outobj)) + ! (insize - (*curinp-*startinp)) + ! repsize - 1; ! if (charmaptranslate_makespace(outobj, outp, requiredsize)) return -1; memcpy(*outp, PyUnicode_AS_UNICODE(*res), sizeof(Py_UNICODE)*repsize); *************** *** 3296,3300 **** /* current output position */ int respos = 0; - int ressize; char *reason = "character maps to <undefined>"; PyObject *errorHandler = NULL; --- 3299,3302 ---- *************** *** 3314,3327 **** res = PyUnicode_FromUnicode(NULL, size); if (res == NULL) ! goto onError; if (size == 0) return res; str = PyUnicode_AS_UNICODE(res); - ressize = size; while (p<endp) { /* try to encode it */ PyObject *x = NULL; ! if (charmaptranslate_output(*p, mapping, &res, &ressize, &str, &x)) { Py_XDECREF(x); goto onError; --- 3316,3328 ---- res = PyUnicode_FromUnicode(NULL, size); if (res == NULL) ! goto onError; if (size == 0) return res; str = PyUnicode_AS_UNICODE(res); while (p<endp) { /* try to encode it */ PyObject *x = NULL; ! if (charmaptranslate_output(startp, p, size, mapping, &res, &str, &x)) { Py_XDECREF(x); goto onError; *************** *** 3342,3346 **** /* find all untranslatable characters */ while (collend < endp) { ! if (charmaptranslate_lookup(*collend, mapping, &x)) goto onError; Py_XDECREF(x); --- 3343,3347 ---- /* find all untranslatable characters */ while (collend < endp) { ! if (charmaptranslate_lookup(*collend, mapping, &x)) goto onError; Py_XDECREF(x); *************** *** 3381,3385 **** char *cp; sprintf(buffer, "%d;", (int)*p); ! if (charmaptranslate_makespace(&res, &str, &ressize, (str-PyUnicode_AS_UNICODE(res))+strlen(buffer)+(endp-collend))) goto onError; --- 3382,3386 ---- char *cp; sprintf(buffer, "%d;", (int)*p); ! if (charmaptranslate_makespace(&res, &str, (str-PyUnicode_AS_UNICODE(res))+strlen(buffer)+(endp-collend))) goto onError; *************** *** 3397,3401 **** /* generate replacement */ repsize = PyUnicode_GET_SIZE(repunicode); ! if (charmaptranslate_makespace(&res, &str, &ressize, (str-PyUnicode_AS_UNICODE(res))+repsize+(endp-collend))) { Py_DECREF(repunicode); --- 3398,3402 ---- /* generate replacement */ repsize = PyUnicode_GET_SIZE(repunicode); ! if (charmaptranslate_makespace(&res, &str, (str-PyUnicode_AS_UNICODE(res))+repsize+(endp-collend))) { Py_DECREF(repunicode); *************** *** 3411,3415 **** /* Resize if we allocated to much */ respos = str-PyUnicode_AS_UNICODE(res); ! if (respos<ressize) { if (_PyUnicode_Resize(&res, respos)) goto onError; --- 3412,3416 ---- /* Resize if we allocated to much */ respos = str-PyUnicode_AS_UNICODE(res); ! if (respos<PyUnicode_GET_SIZE(res)) { if (_PyUnicode_Resize(&res, respos)) goto onError;
participants (1)
-
doerwalterļ¼ users.sourceforge.net