@@ -1286,19 +1286,31 @@ static void Atob(const FunctionCallbackInfo<Value>& args) {
12861286 auto ext = input->GetExternalOneByteStringResource ();
12871287 size_t expected_length =
12881288 simdutf::maximal_binary_length_from_base64 (ext->data (), ext->length ());
1289- buffer.AllocateSufficientStorage (expected_length + 1 );
1290- buffer.SetLengthAndZeroTerminate (expected_length);
1289+ buffer.AllocateSufficientStorage (expected_length);
1290+ buffer.SetLength (expected_length);
12911291 result = simdutf::base64_to_binary (
12921292 ext->data (), ext->length (), buffer.out (), simdutf::base64_default);
1293+ } else if (input->IsOneByte ()) {
1294+ MaybeStackBuffer<uint8_t > stack_buf (input->Length ());
1295+ input->WriteOneByte (args.GetIsolate (),
1296+ stack_buf.out (),
1297+ 0 ,
1298+ input->Length (),
1299+ String::NO_NULL_TERMINATION);
1300+ const char * data = reinterpret_cast <const char *>(*stack_buf);
1301+ size_t expected_length =
1302+ simdutf::maximal_binary_length_from_base64 (data, input->Length ());
1303+ buffer.AllocateSufficientStorage (expected_length);
1304+ buffer.SetLength (expected_length);
1305+ result = simdutf::base64_to_binary (data, input->Length (), buffer.out ());
12931306 } else { // 16-bit case
12941307 String::Value value (env->isolate (), input);
12951308 auto data = reinterpret_cast <const char16_t *>(*value);
12961309 size_t expected_length =
12971310 simdutf::maximal_binary_length_from_base64 (data, value.length ());
1298- buffer.AllocateSufficientStorage (expected_length + 1 );
1299- buffer.SetLengthAndZeroTerminate (expected_length);
1300- result = simdutf::base64_to_binary (
1301- data, value.length (), buffer.out (), simdutf::base64_default);
1311+ buffer.AllocateSufficientStorage (expected_length);
1312+ buffer.SetLength (expected_length);
1313+ result = simdutf::base64_to_binary (data, value.length (), buffer.out ());
13021314 }
13031315
13041316 if (result.error == simdutf::error_code::SUCCESS) {
0 commit comments