diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 37b0f038..138c43c0 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -572,12 +572,16 @@ static void brev( ) { assert(0==(3 & len)); - assert(!((src -4)<=dst && dst < (len + src))); + // Detect overlap which over-writes src before it is used. + assert(!((4+ src)<=dst && dst < (len + src))); for (unsigned j = 0; j < len; j += 4) { - dst[0+ j] = src[3+ j]; - dst[1+ j] = src[2+ j]; - dst[2+ j] = src[1+ j]; - dst[3+ j] = src[0+ j]; + // Simple way (and somewhat slow) to allow in-place brev(). + unsigned char tmp[4]; + memcpy(tmp, j + src, 4); + dst[0+ j] = tmp[3]; + dst[1+ j] = tmp[2]; + dst[2+ j] = tmp[1]; + dst[3+ j] = tmp[0]; } }