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.
}
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);
}
}
})();
+// 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');