Fix alignment of reads in MD5Transform. (#12800)
authorRuben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com>
Mon, 17 Jul 2017 14:10:42 +0000 (17:10 +0300)
committerJan Kotas <jkotas@microsoft.com>
Mon, 17 Jul 2017 14:10:42 +0000 (16:10 +0200)
src/utilcode/md5.cpp

index 8d6f8a3..6901ddb 100644 (file)
@@ -10,6 +10,7 @@
 #include "stdafx.h"
 
 #include <stdlib.h>
+#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];