diff options
author | Jeffrey Yasskin <jyasskin@gmail.com> | 2009-01-09 16:47:07 (GMT) |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@gmail.com> | 2009-01-09 16:47:07 (GMT) |
commit | d89f5b20b2e00241eebd8ca592520c429d6f0d4c (patch) | |
tree | 80a83cfb9b09ee68a91db223c4fbc2e170aa1291 | |
parent | 343b970da9404be5cf6ef3544a11d9da014b4f42 (diff) | |
download | cpython-d89f5b20b2e00241eebd8ca592520c429d6f0d4c.zip cpython-d89f5b20b2e00241eebd8ca592520c429d6f0d4c.tar.gz cpython-d89f5b20b2e00241eebd8ca592520c429d6f0d4c.tar.bz2 |
Fix issue 4884, preventing a crash in the socket code when python is compiled
with llvm-gcc and run with a glibc <2.10.
-rw-r--r-- | Include/pyport.h | 9 | ||||
-rw-r--r-- | Modules/socketmodule.c | 6 |
2 files changed, 14 insertions, 1 deletions
diff --git a/Include/pyport.h b/Include/pyport.h index 15c8644..54411f2 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -709,6 +709,15 @@ typedef struct fd_set { #define Py_FORMAT_PARSETUPLE(func,p1,p2) #endif +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + /* Eliminate end-of-loop code not reached warnings from SunPro C * when using do{...}while(0) macros */ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index deff28a..c1e3cfe 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3334,7 +3334,11 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) #ifdef HAVE_GETHOSTBYNAME_R_3_ARG struct hostent_data data; #else - char buf[16384]; + /* glibcs up to 2.10 assume that the buf argument to + gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc + does not ensure. The attribute below instructs the compiler + to maintain this alignment. */ + char buf[16384] Py_ALIGNED(8); int buf_len = (sizeof buf) - 1; int errnop; #endif |