diff --git a/src/node_buffer.cc b/src/node_buffer.cc index b31beada451bc8..440b101ed3a4cc 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -1229,19 +1229,31 @@ static void Atob(const FunctionCallbackInfo& args) { auto ext = input->GetExternalOneByteStringResource(); size_t expected_length = simdutf::maximal_binary_length_from_base64(ext->data(), ext->length()); - buffer.AllocateSufficientStorage(expected_length + 1); - buffer.SetLengthAndZeroTerminate(expected_length); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); result = simdutf::base64_to_binary( ext->data(), ext->length(), buffer.out(), simdutf::base64_default); + } else if (input->IsOneByte()) { + MaybeStackBuffer stack_buf(input->Length()); + input->WriteOneByte(args.GetIsolate(), + stack_buf.out(), + 0, + input->Length(), + String::NO_NULL_TERMINATION); + const char* data = reinterpret_cast(*stack_buf); + size_t expected_length = + simdutf::maximal_binary_length_from_base64(data, input->Length()); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); + result = simdutf::base64_to_binary(data, input->Length(), buffer.out()); } else { // 16-bit case String::Value value(env->isolate(), input); auto data = reinterpret_cast(*value); size_t expected_length = simdutf::maximal_binary_length_from_base64(data, value.length()); - buffer.AllocateSufficientStorage(expected_length + 1); - buffer.SetLengthAndZeroTerminate(expected_length); - result = simdutf::base64_to_binary( - data, value.length(), buffer.out(), simdutf::base64_default); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); + result = simdutf::base64_to_binary(data, value.length(), buffer.out()); } if (result.error == simdutf::error_code::SUCCESS) {