summaryrefslogtreecommitdiff
path: root/packaging/0017-Fix-alignment-of-reads-in-MD5Transform.-12800.patch
blob: f2d736f1caf1e9003f2dbae4b39a87608d4f7d23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
From 9483a7c0c4a90bd8a6eaa4faecf3136623318cc2 Mon Sep 17 00:00:00 2001
From: Ruben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com>
Date: Mon, 17 Jul 2017 17:10:42 +0300
Subject: [PATCH 17/32] 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 8d6f8a3..6901ddb 100644
--- a/src/utilcode/md5.cpp
+++ b/src/utilcode/md5.cpp
@@ -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];
-- 
2.7.4