[egenix-users] SIGSEGV in mxTextTools when using AppendToTagobj

RICHARD MOSELEY dickie.moseley at virgin.net
Thu May 17 11:12:10 CEST 2012


I have just been spending time compiling the mxTextTools library into the
latest version of the SimpleParse package in a python 2.7.3 virtualenv. The
original packaged mxTextTools was 2.1.0 from 2003, so I decided to use the
latest 3.2.4 package instead; after making all the appropriate changes and
compiling, I then ran the test suite that is in the SimpleParse package,
after running a few of the test the program failed with a SIGSEGV.

I tracked down the problem test to the testAppendToTagobj1 test in the
mx_flag.py suite of tests and more specifically the testAppendToTagobj1
test, I took the test out of the test suite and created a simple test file
as follows:

from simpleparse.stt.TextTools import *
class Test(object):
  worked = ""
  def append(self, value):
    worked = value
tagobj = Test()
result = tag('abbaabccd',((tagobj,AllIn+AppendToTagobj,'ab',0),),0)
print result

When this is run from within the virtualenv I got the following error:

(oratools)rmos at spot$ python /tmp/chktext.py
Fatal Python error: stt/TextTools/mxTextTools/mxte_impl.h:1301 object at
0x242f5b0 has negative ref count -1

Reviewing the code around the stated line 1301 in mxte_impl.h gives the
following code within the TE_HANDLE_MATCH function:

if (flags & MATCH_APPENDTAG) {
...
        if (PyList_Check(tagobj)) {
            if (PyList_Append(tagobj, w)) {
                Py_DECREF(w);
                goto onError;
            }
        }
        else {
            PyObject *result;
            result = PyEval_CallMethod(tagobj, "append", "(O)", w);
            Py_DECREF(w);
            if (result == NULL)
                goto onError;
            Py_DECREF(result);
        }
        Py_DECREF(w);   <-- INCORRECT
        return 0;
    }
...
The problem with the code is that in the case of the tag object not beign a
list the temporary 'w' object is DECREF'ed twice if the append is
successful.

I commented out the extra call of Py_DECREF(w) and reran the test script,
and it returned:

(oratools)rmos at spot2: python /tmp/chktext.py
(1, [], 6)

which is what is by the original test.

I though that I should share this with you, in the hope that this will
remove at least one cause of SIGSEGV in the mxTextTools package.

Richard Moseley
-------------- next part --------------
An HTML attachment was scrubbed...
URL: /mailman-archives/egenix-users/attachments/20120517/7b339b1a/attachment.htm


More information about the egenix-users mailing list