Hello, The patch is the result of the following threads:
Here is a patch correcting md5_process_bytes when we are in the case of unaligned pointers.A pair of brace was missing, leading the buffer to be shift 2 times losing a part of its content. The patch also remove a preprocessor #if testing if _STRING_ARCH_unaligned is defined. This symbol is never defined in gcc and could be only used in CFLAGS. Looking at the code, it does not looks usefull to define it (and it is only tested on libiberty/md5.c and libiberty/sha1.c), as we already check the pointer alignement, so removing it clean the code. I searched on google, and it does not looks to be used. Does anyone want it or thing that it should not be removed? Ok for trunk ? Thanks! Pierre Vittet PS: I also write a small gcc plugin, allowing to easily test md5_process_bytes, if can change your environment in a way where the pointer buffer is not aligned, you should get the bug.
Index: libiberty/md5.c =================================================================== --- libiberty/md5.c (révision 178905) +++ libiberty/md5.c (copie de travail) @@ -227,7 +227,6 @@ md5_process_bytes (const void *buffer, size_t len, /* Process available complete blocks. */ if (len > 64) { -#if !_STRING_ARCH_unaligned /* To check alignment gcc has an appropriate operator. Other compilers don't. */ # if __GNUC__ >= 2 @@ -244,10 +243,11 @@ md5_process_bytes (const void *buffer, size_t len, len -= 64; } else -#endif - md5_process_block (buffer, len & ~63, ctx); - buffer = (const void *) ((const char *) buffer + (len & ~63)); - len &= 63; + { + md5_process_block (buffer, len & ~63, ctx); + buffer = (const void *) ((const char *) buffer + (len & ~63)); + len &= 63; + } } /* Move remaining bytes in internal buffer. */
2011-09-16 Pierre Vittet <pier...@pvittet.com> * md5.c (md5_process_bytes): Remove unused _STRING_ARCH_unaligned, add missing braces.
micro_plugin_md5.tar.gz
Description: GNU Zip compressed data