mirror of https://github.com/nodejs/node.git
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
parent
f57ff787aa
commit
d5d5170c35
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Reference in New Issue