From 5ceac6362ffbc61b5159e4413d678a8ff6176f8b Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 17 Jul 2017 17:10:42 +0300 Subject: Fix alignment of reads in MD5Transform. (#12800) --- src/utilcode/md5.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/utilcode/md5.cpp b/src/utilcode/md5.cpp index 8d6f8a3282..6901ddbf91 100644 --- a/src/utilcode/md5.cpp +++ b/src/utilcode/md5.cpp @@ -10,6 +10,7 @@ #include "stdafx.h" #include +#include "stdmacros.h" #include "md5.h" #include "contract.h" @@ -76,7 +77,16 @@ void MD5::HashMore(const void* pvInput, ULONG cbInput) // Hash the data in 64-byte runs, starting just after what we've copied while (cbInput >= 64) { - MD5Transform(m_state, (ULONG*)pbInput); + if (IS_ALIGNED(pbInput, sizeof(ULONG))) + { + MD5Transform(m_state, (ULONG*)pbInput); + } + else + { + ULONG inputCopy[64 / sizeof(ULONG)]; + memcpy(inputCopy, pbInput, sizeof(inputCopy)); + MD5Transform(m_state, inputCopy); + } pbInput += 64; cbInput -= 64; } @@ -213,6 +223,8 @@ void MD5::GetHashValue(MD5HASHDATA* phash) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; + _ASSERTE(IS_ALIGNED(data, sizeof(ULONG))); + ULONG a=state[0]; ULONG b=state[1]; ULONG c=state[2]; -- cgit v1.2.3