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.
pull/41362/head
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) {
size = base64_decoded_size_fast(size);
if (size == 0)
return 0;
const char* end = src + size;
// check for trailing padding (1 or 2 bytes)
if (size > 0) {
if (end[-1] == '=') size--;
if (size > 0 && end[-2] == '=') size--;
}
if (src[size - 1] == '=')
size--;
if (size > 0 && src[size - 1] == '=')
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.
assert.throws(function() {
Buffer('', 'buffer');