Python 2.3.2 & Netware

Jeff Davey j at submersion.com
Mon Nov 10 23:34:37 EST 2003


I spent the day porting & building a .a that I could link into an NLM 
(statically) and run on Netware, for the purpose of using Python in an 
application.

So far, everything (from the compiling process) works great. I built a 
little test.nlm to see if everything works good:

#include <Python.h>

int main(int argc, char *argv[])
{
    Py_Initialize();
    PyRun_SimpleString("print 'Hi there'\n");
    Py_Finalize();
    return 0;
}

I then loaded up this NLM (of like, 3.8MB or so) into protected memory 
space on a Netware 5.1 server.

Near instantly, I get an abend of such:
Removed address space because of memory protection violation
Reason: Free detected corrupt preceeding redzone for node

So, I wade through the Python source to discover what's happening:

Py_Initialize() is called
 From there we get down to _Py_ReadyTypes();

In _Py_ReadyTypes we get to the first line:
if (PyType_Ready(&PyType_Type) <0)


In PyType_Ready we initialize the base class (ie: recurse once), and 
proceed to the following (about to do the type type):

if (add_operators(type) < 0)
	goto error;


Following that we get to add_operators:
descr = PyDescr_NewWrapper(type, p, *ptr);

and further down in PyDescr_NewWrapper..
descr = (PyWrapperDescObject *)descr_new(&PyWrapperDescr_Type, type, 
base->name);
Just to note, the name here is '__cmp__'

Then in descr_new (getting close now, I promise! :):
descr->d_name = PyString_InternFromString(name);

In that particular function, the abend seems to happen in 
PyString_InternInPlace(&s)

So Following that, and this is where the abend happens,

In PyString_InternInPlace(PyObject **p) you have this:

if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL {
   Py_INCREF(t);
   Py_DECREF(*p); // THE ABEND IS HERE
   *p = t;
   return;
}

The abend happens on the Py_DECREF(*p).

Now, I had a hard time trying to figure out exactly what this type of 
abend means, but from what I understand, that peice of memory has been 
corrupted at some point.

When I ported this, I modified the pyconfig.h by hand, perhaps this 
problem is caused by inserting a wrong value (which I sort of doubt 
right now...) into the 'type' sizes ?

Let me know if you have any ideas....

Thanks!

Jeff Davey





More information about the Python-list mailing list