Commit df367a66 authored by Luca Boccassi's avatar Luca Boccassi

Problem: pointer union for zmq_msg_t is a hack

Solution: use compiler's alignment attributes instead which is
clearer and less of a hack.
Pointer alignment violations causing crashes on architectures
such as sparc64 and aarch64.
This also avoid triggering ABI checkers as the change is compatible
even though applications that suffer from the bug should rebuild to
take advantage of the fix.
parent 2e926435
...@@ -229,10 +229,21 @@ ZMQ_EXPORT int zmq_ctx_destroy (void *context); ...@@ -229,10 +229,21 @@ ZMQ_EXPORT int zmq_ctx_destroy (void *context);
/* 0MQ message definition. */ /* 0MQ message definition. */
/******************************************************************************/ /******************************************************************************/
/* union here ensures correct alignment on architectures that require it, e.g. /* Some architectures, like sparc64 and some variants of aarch64, enforce pointer
* SPARC * alignment and raise sigbus on violations. Make sure applications allocate
* zmq_msg_t on addresses aligned on a pointer-size boundary to avoid this issue.
*/ */
typedef union zmq_msg_t {unsigned char _ [64]; void *p; } zmq_msg_t; typedef struct zmq_msg_t {
#if defined (__GNUC__) || defined ( __INTEL_COMPILER) || \
(defined (__SUNPRO_C) && __SUNPRO_C >= 0x590) || \
(defined (__SUNPRO_CC) && __SUNPRO_CC >= 0x590)
unsigned char _ [64] __attribute__ ((aligned (sizeof (void *))));
#elif defined(_MSC_VER)
__declspec (align (sizeof (void *))) unsigned char _ [64];
#else
unsigned char _ [64];
#endif
} zmq_msg_t;
typedef void (zmq_free_fn) (void *data, void *hint); typedef void (zmq_free_fn) (void *data, void *hint);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment