[PATCH 1/2] lib: fix byte order test in libsha1.c
Tomi Ollila
tomi.ollila at iki.fi
Mon Nov 25 01:43:37 PST 2013
On Sun, Nov 24 2013, david at tethera.net wrote:
> From: David Bremner <david at tethera.net>
>
> Previously PLATFORM_BYTE_ORDER and IS_LITTLE_ENDIAN were not defined,
> so the little endian code was always compiled in.
>
> This will have the effect that the "SHA1s" on big endian architectures
> will change (i.e. become actual sha1s). So someone re-indexing their
> database could conceivable lose tags on messages without a message-id
> header.
> ---
> lib/libsha1.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/lib/libsha1.c b/lib/libsha1.c
> index 5d16f6a..794854b 100644
> --- a/lib/libsha1.c
> +++ b/lib/libsha1.c
> @@ -49,11 +49,17 @@ extern "C"
>
> #define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00))
>
> -#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
> -#define bsw_32(p,n) \
> - { int _i = (n); while(_i--) ((uint32_t*)p)[_i] = bswap_32(((uint32_t*)p)[_i]); }
> +#ifdef __BYTE_ORDER__
> +# if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
> +# define bsw_32(p,n) \
> + { int _i = (n); while(_i--) ((uint32_t*)p)[_i] = bswap_32(((uint32_t*)p)[_i]); }
> +# elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
> +# define bsw_32(p,n)
> +# else
> +# error "unknown byte order"
> +# endif
> #else
> -#define bsw_32(p,n)
> +# error "macro __BYTE_ORDER__ is not defined"
> #endif
LGTM.
When you modify te NEWS entry by adding instructions how to find
out those sha1's of message-id:s that are affected (Austin's code)
You could perhaps add note of the origin of these macros
(i.e. something like
/* These "Common Predefined Macros" below are GNU C extensions */ )
See http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
for reference.
Tomi
>
> #define SHA1_MASK (SHA1_BLOCK_SIZE - 1)
> --
> 1.8.4.2
More information about the notmuch
mailing list