3ccdab
From be2b335dc24da491d886dfa68d2c35b38f95d59a Mon Sep 17 00:00:00 2001
3ccdab
From: Markus Mohrhard <markus.mohrhard@googlemail.com>
3ccdab
Date: Thu, 14 Aug 2014 01:33:48 +0200
3ccdab
Subject: [PATCH] fix invalid memory access in base64 functions
3ccdab
3ccdab
Boost expects the input to be a multiple of 3 bytes for the encoding and
3ccdab
a multiple of 4 bytes for the decoding. Otherwise it accesses past the
3ccdab
end of the input array. Therefore we now pad with '\0' and replace the
3ccdab
generated 'A' with '='.
3ccdab
---
3ccdab
 src/parser/base64.cpp | 17 ++++++++++++++---
3ccdab
 1 file changed, 14 insertions(+), 3 deletions(-)
3ccdab
3ccdab
diff --git a/src/parser/base64.cpp b/src/parser/base64.cpp
3ccdab
index 3d9d770..11ea38e 100644
3ccdab
--- a/src/parser/base64.cpp
3ccdab
+++ b/src/parser/base64.cpp
3ccdab
@@ -49,9 +49,20 @@ void encode_to_base64(const std::vector<char>& input, string& encoded)
3ccdab
     if (input.empty())
3ccdab
         return;
3ccdab
 
3ccdab
-    string _encoded(to_base64(input.begin()), to_base64(input.end()));
3ccdab
-    size_t pad_size = (3 - input.size() % 3) % 3;
3ccdab
-    _encoded.append(pad_size, '=');
3ccdab
+    std::vector<char> inp = input;
3ccdab
+    size_t pad_size = (3 - inp.size() % 3) % 3;
3ccdab
+    inp.resize(inp.size() + pad_size);
3ccdab
+
3ccdab
+    string _encoded(to_base64(inp.begin()), to_base64(inp.end()));
3ccdab
+
3ccdab
+    string::reverse_iterator it = _encoded.rbegin();
3ccdab
+    for (size_t i = 0; i < pad_size; ++i, ++it)
3ccdab
+    {
3ccdab
+        // 'A' is a base64 encoding of '\0'
3ccdab
+        // replace them with padding charachters '='
3ccdab
+        if (*it == 'A')
3ccdab
+            *it = '=';
3ccdab
+    }
3ccdab
 
3ccdab
     encoded.swap(_encoded);
3ccdab
 }
3ccdab
-- 
3ccdab
2.3.4
3ccdab