string_bytes: strip padding from base64 strings

Because of variations in different base64 implementation, it's been
decided to strip all padding from the end of a base64 string and
calculate its size from that.
This commit is contained in:
Trevor Norris 2013-05-20 12:35:31 -07:00
parent f57ff787aa
commit d5d5170c35
2 changed files with 11 additions and 8 deletions

View File

@ -63,16 +63,15 @@ static inline size_t base64_decoded_size_fast(size_t size) {
} }
static inline size_t base64_decoded_size(const char* src, size_t size) { static inline size_t base64_decoded_size(const char* src, size_t size) {
size = base64_decoded_size_fast(size); if (size == 0)
return 0;
const char* end = src + size; if (src[size - 1] == '=')
// check for trailing padding (1 or 2 bytes) size--;
if (size > 0) { if (size > 0 && src[size - 1] == '=')
if (end[-1] == '=') size--; size--;
if (size > 0 && end[-2] == '=') size--;
}
return size; return base64_decoded_size_fast(size);
} }

View File

@ -980,6 +980,10 @@ assert.throws(function() {
} }
})(); })();
// Make sure byteLength properly checks for base64 padding
assert.equal(Buffer.byteLength('aaa=', 'base64'), 2);
assert.equal(Buffer.byteLength('aaaa==', 'base64'), 3);
// Regression test for #5482: should throw but not assert in C++ land. // Regression test for #5482: should throw but not assert in C++ land.
assert.throws(function() { assert.throws(function() {
Buffer('', 'buffer'); Buffer('', 'buffer');