Skip to content

Commit 1381541

Browse files
mertcanaltinaduh95
authored andcommitted
util: fix Latin1 decoding to return string output
PR-URL: #56222Fixes: #56219 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Daniel Lemire <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 1d8cc61 commit 1381541

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

‎src/encoding_binding.cc‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,11 @@ void BindingData::DecodeLatin1(const FunctionCallbackInfo<Value>& args){
286286
env->isolate(), "The encoded data was not valid for encoding latin1");
287287
}
288288

289-
Local<Object> buffer_result =
290-
node::Buffer::Copy(env, result.c_str(), written).ToLocalChecked();
291-
args.GetReturnValue().Set(buffer_result);
289+
Local<String> output =
290+
String::NewFromUtf8(
291+
env->isolate(), result.c_str(), v8::NewStringType::kNormal, written)
292+
.ToLocalChecked();
293+
args.GetReturnValue().Set(output);
292294
}
293295

294296
} // namespace encoding_binding

‎test/cctest/test_encoding_binding.cc‎

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ bool RunDecodeLatin1(Environment* env,
2626
returnfalse;
2727
}
2828

29-
*result = try_catch.Exception();
29+
*result = args[0];
3030
returntrue;
3131
}
3232

@@ -151,5 +151,26 @@ TEST_F(EncodingBindingTest, DecodeLatin1_BOMPresent){
151151
EXPECT_STREQ(*utf8_result, "Áéó");
152152
}
153153

154+
TEST_F(EncodingBindingTest, DecodeLatin1_ReturnsString){
155+
Environment* env = CreateEnvironment();
156+
Isolate* isolate = env->isolate();
157+
HandleScope handle_scope(isolate);
158+
159+
constuint8_t latin1_data[] ={0xC1, 0xE9, 0xF3};
160+
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
161+
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
162+
163+
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
164+
Local<Value> args[] ={array};
165+
166+
Local<Value> result;
167+
ASSERT_TRUE(RunDecodeLatin1(env, args, false, false, &result));
168+
169+
ASSERT_TRUE(result->IsString());
170+
171+
String::Utf8Value utf8_result(isolate, result);
172+
EXPECT_STREQ(*utf8_result, "Áéó");
173+
}
174+
154175
} // namespace encoding_binding
155176
} // namespace node
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
5+
consttest=require('node:test');
6+
constassert=require('node:assert');
7+
8+
test('TextDecoder correctly decodes windows-1252 encoded data',{skip: !common.hasIntl},()=>{
9+
constlatin1Bytes=newUint8Array([0xc1,0xe9,0xf3]);
10+
11+
constexpectedString='Áéó';
12+
13+
constdecoder=newTextDecoder('windows-1252');
14+
constdecodedString=decoder.decode(latin1Bytes);
15+
16+
assert.strictEqual(decodedString,expectedString);
17+
});

0 commit comments

Comments
(0)