[ZCM] [ZC] 1267/ 6 Comment "Segfault on x86_64"

Collector: Zope Bugs, Features, and Patches ... zope-coders-admin at zope.org
Thu Aug 5 05:40:08 EDT 2004

Issue #1267 Update (Comment) "Segfault on x86_64"
 Status Pending, Zope/bug+solution medium
To followup, visit:

= Comment - Entry #6 by longsleep on Aug 5, 2004 5:40 am

i confirm that this patch works. I wonder a bit why it hasnt made its way in 2.7.1 or 2.7.2. 

With this patch applied initgroups works pretty well on both 32 and 64 bit linux systems.

There is a small typo in the original patch. "usigned int igid;" needs to become "unsigned int igid;"

Please consider to apply this patch to zopes cvs trunk  to have it fixed in further releases.

= Resubmit - Entry #5 by tseaver on Mar 22, 2004 1:38 pm

 Status: Resolved => Pending

OK, 1268 is the decoy, then.
= Resolve - Entry #4 by tseaver on Mar 22, 2004 12:02 pm

 Status: Pending => Resolved

Submitter followed up with a modified patch in #1268:

= Comment - Entry #3 by nijel on Mar 22, 2004 11:58 am

Uploaded:  "Zope-2.7.0-gid2.patch"
 - http://collector.zope.org/Zope/1267/Zope-2.7.0-gid2.patch/view
I is not solution as int is 64-bit on x86_64. Anyway the original patch was bad, it has to be unsigned int to hold gid_t...

gid_t is currently on linux defined as u32. This works fine with int on 32-bit platforms, but not on 64-bit, where 32 bits around get replaced.
= Comment - Entry #2 by tim_one on Mar 22, 2004 11:45 am

Well, C doesn't define the size of any integer type.  Starting with Python 2.3 (which is required for Zope 2.7), you can use the "I" format code in PyArg_ParseTuple to get whatever the platform C compiler thinks an unsigned int is.  There's no guarantee that this is 32 bits, although it is on all Python platforms I know about except for some Cray machines.

The other insecurity here is your claim that gid_t is an unsigned 32-bit int.  I don't doubt that it is on your platform today, but it can't be that on all platforms (for example, the Crays mentioned above don't have any 32-bit integer type).

All that out of the way, your patch is definitely an improvement, and fixing it for all possible platforms is a real chore (e.g., get the group id as a Python object, and then do runtime case analysis on the type of the argument versus the size of the platform's gid_t).  The

    gid = igid;

line should really add an explicit cast for clarity:

    gid = (gid_t)igid;
= Request - Entry #1 by nijel on Mar 22, 2004 10:35 am

Uploaded:  "Zope-2.7.0-gid.patch"
 - http://collector.zope.org/Zope/1267/Zope-2.7.0-gid.patch/view
initgroups wants to get gid_t from tuple what leads to segfault on some platforms as gid_t is defined as unsigned 32-bit. Parsing as long is okay on ix86, but on x86_64 (AMD64) this leads to segfault as long is 64-bit. The additional conversion through might not be needed, but I don't see way how to specify unsigned 32-bit integer in PyArg_ParseTuple.

More information about the Zope-Collector-Monitor mailing list