Skip to content

Commit 8ee3e5a

Browse files
committed
- Changes donated by Elemental Security to make it work on AIX 5.3
with IBM's 64-bit compiler (SF patch #1284289). This also closes SF bug python#105470: test_pwd fails on 64bit system (Opteron).
1 parent 539c662 commit 8ee3e5a

11 files changed

Lines changed: 106 additions & 51 deletions

File tree

Include/import.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule(char *);
2424
PyAPI_FUNC(struct filedescr *) _PyImport_FindModule(
2525
const char *, PyObject *, char *, size_t, FILE **, PyObject **);
2626
PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr *);
27+
PyAPI_FUNC(void) _PyImport_ReInitLock(void);
2728

2829
PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *);
2930
PyAPI_FUNC(PyObject *)_PyImport_FixupExtension(char *, char *);

Lib/test/regrtest.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,34 @@ def printlist(x, width=70, indent=4):
10701070
test_winreg
10711071
test_winsound
10721072
""",
1073+
'aix5':
1074+
"""
1075+
test_aepack
1076+
test_al
1077+
test_applesingle
1078+
test_bsddb
1079+
test_bsddb185
1080+
test_bsddb3
1081+
test_bz2
1082+
test_cd
1083+
test_cl
1084+
test_dl
1085+
test_gdbm
1086+
test_gl
1087+
test_gzip
1088+
test_imgfile
1089+
test_linuxaudiodev
1090+
test_macfs
1091+
test_macostools
1092+
test_nis
1093+
test_ossaudiodev
1094+
test_sunaudiodev
1095+
test_tcl
1096+
test_winreg
1097+
test_winsound
1098+
test_zipimport
1099+
test_zlib
1100+
""",
10731101
}
10741102
_expectations['freebsd5'] = _expectations['freebsd4']
10751103
_expectations['freebsd6'] = _expectations['freebsd4']

Lib/test/test_ioctl.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from test_support import TestSkipped, run_unittest
2+
from test.test_support import TestSkipped, run_unittest
33
import os, struct
44
try:
55
import fcntl, termios
@@ -16,19 +16,23 @@
1616

1717
class IoctlTests(unittest.TestCase):
1818
def test_ioctl(self):
19-
pgrp = os.getpgrp()
19+
# If this process has been put into the background, TIOCGPGRP returns
20+
# the session ID instead of the process group id.
21+
ids = (os.getpgrp(), os.getsid(0))
2022
tty = open("/dev/tty", "r")
2123
r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
22-
self.assertEquals(pgrp, struct.unpack("i", r)[0])
24+
rpgrp = struct.unpack("i", r)[0]
25+
self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
2326

2427
def test_ioctl_mutate(self):
2528
import array
2629
buf = array.array('i', [0])
27-
pgrp = os.getpgrp()
30+
ids = (os.getpgrp(), os.getsid(0))
2831
tty = open("/dev/tty", "r")
2932
r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
33+
rpgrp = buf[0]
3034
self.assertEquals(r, 0)
31-
self.assertEquals(pgrp, buf[0])
35+
self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
3236

3337
def test_main():
3438
run_unittest(IoctlTests)

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ What's New in Python 2.5 alpha 1?
1212
Core and builtins
1313
-----------------
1414

15+
- Changes donated by Elemental Security to make it work on AIX 5.3
16+
with IBM's 64-bit compiler (SF patch #1284289). This also closes SF
17+
bug #105470: test_pwd fails on 64bit system (Opteron).
18+
1519
- Changes donated by Elemental Security to make it work on HP-UX 11 on
1620
Itanium2 with HP's 64-bit compiler (SF patch #1225212).
1721

Modules/grpmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ mkgrent(struct group *p)
8585
static PyObject *
8686
grp_getgrgid(PyObject *self, PyObject *args)
8787
{
88-
int gid;
88+
unsigned int gid;
8989
struct group *p;
90-
if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
90+
if (!PyArg_ParseTuple(args, "I:getgrgid", &gid))
9191
return NULL;
9292
if ((p = getgrgid(gid)) == NULL) {
9393
PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);

Modules/makexp_aix

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ echo "*" >> $expFileName
7070
# left with just the symbol name.
7171
# 7. Eliminate all entries containing two colons, like Class::method
7272
#
73-
/usr/ccs/bin/nm -Bex $inputFiles \
73+
74+
# Use -X32_64 if it appears to be implemented in this version of 'nm'.
75+
NM=/usr/ccs/bin/nm
76+
xopt=-X32_64
77+
$NM -e $xopt $1 >/dev/null 2>&1 || xopt=""
78+
79+
$NM -Bex $xopt $inputFiles \
7480
| sed -e '/ [^BDT] /d' -e '/\./d' -e 's/.* [BDT] //' -e '/::/d' \
7581
| sort | uniq >> $expFileName

Modules/pwdmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ See pwd.__doc__ for more on password database entries.");
102102
static PyObject *
103103
pwd_getpwuid(PyObject *self, PyObject *args)
104104
{
105-
int uid;
105+
unsigned int uid;
106106
struct passwd *p;
107-
if (!PyArg_ParseTuple(args, "i:getpwuid", &uid))
107+
if (!PyArg_ParseTuple(args, "I:getpwuid", &uid))
108108
return NULL;
109109
if ((p = getpwuid(uid)) == NULL) {
110110
PyErr_Format(PyExc_KeyError,

Modules/signalmodule.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,5 +669,6 @@ PyOS_AfterFork(void)
669669
PyEval_ReInitThreads();
670670
main_thread = PyThread_get_thread_ident();
671671
main_pid = getpid();
672+
_PyImport_ReInitLock();
672673
#endif
673674
}

Modules/socketmodule.c

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
13441344
static PyObject *
13451345
sock_accept(PySocketSockObject *s)
13461346
{
1347-
char addrbuf[256];
1347+
sock_addr_t addrbuf;
13481348
SOCKET_T newfd;
13491349
socklen_t addrlen;
13501350
PyObject *sock = NULL;
@@ -1354,7 +1354,7 @@ sock_accept(PySocketSockObject *s)
13541354

13551355
if (!getsockaddrlen(s, &addrlen))
13561356
return NULL;
1357-
memset(addrbuf, 0, addrlen);
1357+
memset(&addrbuf, 0, addrlen);
13581358

13591359
#ifdef MS_WINDOWS
13601360
newfd = INVALID_SOCKET;
@@ -1365,7 +1365,7 @@ sock_accept(PySocketSockObject *s)
13651365
Py_BEGIN_ALLOW_THREADS
13661366
timeout = internal_select(s, 0);
13671367
if (!timeout)
1368-
newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1368+
newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
13691369
&addrlen);
13701370
Py_END_ALLOW_THREADS
13711371

@@ -1392,7 +1392,7 @@ sock_accept(PySocketSockObject *s)
13921392
SOCKETCLOSE(newfd);
13931393
goto finally;
13941394
}
1395-
addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
1395+
addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
13961396
addrlen, s->sock_proto);
13971397
if (addr == NULL)
13981398
goto finally;
@@ -1865,19 +1865,19 @@ Return a new socket object connected to the same system resource.");
18651865
static PyObject *
18661866
sock_getsockname(PySocketSockObject *s)
18671867
{
1868-
char addrbuf[256];
1868+
sock_addr_t addrbuf;
18691869
int res;
18701870
socklen_t addrlen;
18711871

18721872
if (!getsockaddrlen(s, &addrlen))
18731873
return NULL;
1874-
memset(addrbuf, 0, addrlen);
1874+
memset(&addrbuf, 0, addrlen);
18751875
Py_BEGIN_ALLOW_THREADS
1876-
res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
1876+
res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
18771877
Py_END_ALLOW_THREADS
18781878
if (res < 0)
18791879
return s->errorhandler();
1880-
return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1880+
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
18811881
s->sock_proto);
18821882
}
18831883

@@ -1894,19 +1894,19 @@ info is a pair (hostaddr, port).");
18941894
static PyObject *
18951895
sock_getpeername(PySocketSockObject *s)
18961896
{
1897-
char addrbuf[256];
1897+
sock_addr_t addrbuf;
18981898
int res;
18991899
socklen_t addrlen;
19001900

19011901
if (!getsockaddrlen(s, &addrlen))
19021902
return NULL;
1903-
memset(addrbuf, 0, addrlen);
1903+
memset(&addrbuf, 0, addrlen);
19041904
Py_BEGIN_ALLOW_THREADS
1905-
res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
1905+
res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
19061906
Py_END_ALLOW_THREADS
19071907
if (res < 0)
19081908
return s->errorhandler();
1909-
return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
1909+
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
19101910
s->sock_proto);
19111911
}
19121912

@@ -2115,7 +2115,7 @@ the remote end is closed and all data is read, return the empty string.");
21152115
static PyObject *
21162116
sock_recvfrom(PySocketSockObject *s, PyObject *args)
21172117
{
2118-
char addrbuf[256];
2118+
sock_addr_t addrbuf;
21192119
PyObject *buf = NULL;
21202120
PyObject *addr = NULL;
21212121
PyObject *ret = NULL;
@@ -2132,18 +2132,18 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
21322132
return NULL;
21332133

21342134
Py_BEGIN_ALLOW_THREADS
2135-
memset(addrbuf, 0, addrlen);
2135+
memset(&addrbuf, 0, addrlen);
21362136
timeout = internal_select(s, 0);
21372137
if (!timeout)
21382138
n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
21392139
#ifndef MS_WINDOWS
21402140
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
2141-
(struct sockaddr *)addrbuf, &addrlen
2141+
(struct sockaddr *) &addrbuf, &addrlen
21422142
#else
2143-
(void *)addrbuf, &addrlen
2143+
(void *) &addrbuf, &addrlen
21442144
#endif
21452145
#else
2146-
(struct sockaddr *)addrbuf, &addrlen
2146+
(struct sockaddr *) &addrbuf, &addrlen
21472147
#endif
21482148
);
21492149
Py_END_ALLOW_THREADS
@@ -2161,7 +2161,7 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
21612161
if (n != len && _PyString_Resize(&buf, n) < 0)
21622162
return NULL;
21632163

2164-
if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
2164+
if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
21652165
addrlen, s->sock_proto)))
21662166
goto finally;
21672167

@@ -2589,11 +2589,7 @@ static PyObject *
25892589
socket_gethostbyname(PyObject *self, PyObject *args)
25902590
{
25912591
char *name;
2592-
#ifdef ENABLE_IPV6
2593-
struct sockaddr_storage addrbuf;
2594-
#else
2595-
struct sockaddr_in addrbuf;
2596-
#endif
2592+
sock_addr_t addrbuf;
25972593

25982594
if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
25992595
return NULL;

Modules/socketmodule.h

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,26 @@ typedef int SOCKET_T;
7272
# define SIZEOF_SOCKET_T SIZEOF_INT
7373
#endif
7474

75+
/* Socket address */
76+
typedef union sock_addr {
77+
struct sockaddr_in in;
78+
#ifdef AF_UNIX
79+
struct sockaddr_un un;
80+
#endif
81+
#ifdef ENABLE_IPV6
82+
struct sockaddr_in6 in6;
83+
struct sockaddr_storage storage;
84+
#endif
85+
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
86+
struct sockaddr_l2 bt_l2;
87+
struct sockaddr_rc bt_rc;
88+
struct sockaddr_sco bt_sco;
89+
#endif
90+
#ifdef HAVE_NETPACKET_PACKET_H
91+
struct sockaddr_ll ll;
92+
#endif
93+
} sock_addr_t;
94+
7595
/* The object holding a socket. It holds some extra information,
7696
like the address family, which is used to decode socket address
7797
arguments properly. */
@@ -82,24 +102,7 @@ typedef struct {
82102
int sock_family; /* Address family, e.g., AF_INET */
83103
int sock_type; /* Socket type, e.g., SOCK_STREAM */
84104
int sock_proto; /* Protocol type, usually 0 */
85-
union sock_addr {
86-
struct sockaddr_in in;
87-
#ifdef AF_UNIX
88-
struct sockaddr_un un;
89-
#endif
90-
#ifdef ENABLE_IPV6
91-
struct sockaddr_in6 in6;
92-
struct sockaddr_storage storage;
93-
#endif
94-
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
95-
struct sockaddr_l2 bt_l2;
96-
struct sockaddr_rc bt_rc;
97-
struct sockaddr_sco bt_sco;
98-
#endif
99-
#ifdef HAVE_NETPACKET_PACKET_H
100-
struct sockaddr_ll ll;
101-
#endif
102-
} sock_addr;
105+
sock_addr_t sock_addr; /* Socket address */
103106
PyObject *(*errorhandler)(void); /* Error handler; checks
104107
errno, returns NULL and
105108
sets a Python exception */

0 commit comments

Comments
 (0)