Changeset 3254:8d4487d1a1b3 in livinglogic.python.xist

Show
Ignore:
Timestamp:
04/11/08 19:29:26 (12 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Fix refcounting bug in sgmlop.attrparse().

This bug always led to a "Deallocating None" message.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/xist/sgmlop.c

    r2964 r3254  
    12121212{ 
    12131213    PyObject* key = NULL; 
    1214     PyObject* value = NULL; 
    12151214    const CHAR_T* q; 
    12161215 
     
    12371236                ); 
    12381237            if (!res) 
    1239                 return -1; 
     1238                goto err; 
    12401239            Py_DECREF(res); 
    12411240        } 
    1242         if (self->xml) 
    1243             value = Py_None; 
    1244         else 
    1245             value = key; /* in SGML mode, default is same as key */ 
    1246         Py_INCREF(value); 
    12471241 
    12481242        while (p < end && ISSPACE(*p)) 
     
    12531247            int is_entity = 0; 
    12541248            /* attribute value found */ 
    1255             Py_DECREF(value); 
    12561249 
    12571250            if (p < end) 
     
    12691262                    if (!is_entity && *p == '&') { 
    12701263                        if (handle_data(self, q, p)) 
    1271                             return -1; 
     1264                            goto err; 
    12721265                        is_entity = 1; 
    12731266                        q = ++p; 
     
    12751268                    else if (is_entity && *p == ';') { 
    12761269                        if (handle_entityref(self, q, p)) 
    1277                             return -1; 
     1270                            goto err; 
    12781271                        is_entity = 0; 
    12791272                        q = ++p; 
     
    12841277                if (is_entity) { 
    12851278                    if (handle_entityref(self, q, p)) 
    1286                         return -1; 
     1279                        goto err; 
    12871280                } else { 
    12881281                    if (handle_data(self, q, p)) 
    1289                         return -1; 
     1282                        goto err; 
    12901283                } 
    12911284                if (quote) 
     
    12951288        else { 
    12961289            /* No attribute value */ 
    1297             if (value != Py_None && self->handle_data) { 
     1290            if (!self->xml && self->handle_data) { 
    12981291                PyObject* res = PyObject_CallFunction( 
    1299                     self->handle_data, "O", value 
     1292                    self->handle_data, "O", key 
    13001293                ); 
    13011294                if (!res) 
    1302                     return -1; 
     1295                    goto err; 
    13031296                Py_DECREF(res); 
    13041297            } 
     
    13091302                ); 
    13101303            if (!res) 
    1311                 return -1; 
     1304                goto err; 
    13121305            Py_DECREF(res); 
    13131306        } 
    13141307        Py_DECREF(key); 
    1315         Py_DECREF(value); 
    13161308        key = NULL; 
    1317         value = NULL; 
    13181309    } 
    13191310 
     
    13221313  err: 
    13231314    Py_XDECREF(key); 
    1324     Py_XDECREF(value); 
    13251315    return -1; 
    13261316}