diff --git a/CHANGES b/CHANGES index 60d0c4cbfc..959a8d32ec 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5030. [bug] Align CMSG buffers to a 64-bit boundary, fixes crash + on architectures with strict alignment. [GL #521] + --- 9.13.3 released --- 5029. [func] Workarounds for servers that misbehave when queried diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index bb0c8854a8..acc3d64c64 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -259,6 +259,11 @@ extern void mock_assert(const int result, const char* const expression, */ #define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS) +/*% + * Alignment + */ +#define ALIGN(x, a) (((x) + (a) - 1) & ~((typeof(x))(a)-1)) + /*% * Misc */ diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 343cec2234..62a00cddac 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -315,8 +315,9 @@ typedef isc_event_t intev_t; #define CMSG_SP_INT 24 -#define RECVCMSGBUFLEN (2*(CMSG_SP_IN6PKT + CMSG_SP_TIMESTAMP + CMSG_SP_TCTOS)+1) -#define SENDCMSGBUFLEN (2*(CMSG_SP_IN6PKT + CMSG_SP_INT + CMSG_SP_TCTOS)+1) +/* Align cmsg buffers to be safe on SPARC etc. */ +#define RECVCMSGBUFLEN ALIGN(2*(CMSG_SP_IN6PKT + CMSG_SP_TIMESTAMP + CMSG_SP_TCTOS)+1, sizeof(void*)) +#define SENDCMSGBUFLEN ALIGN(2*(CMSG_SP_IN6PKT + CMSG_SP_INT + CMSG_SP_TCTOS)+1, sizeof(void*)) /*% * The number of times a send operation is repeated if the result is EINTR.