summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pyport.h9
-rw-r--r--Modules/socketmodule.c6
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