Skip to content

Commit 4a1b51b

Browse files
mertcanaltinruyadorno
authored andcommitted
util: fix Latin1 decoding to return string output
PR-URL: #56222 Fixes: #56219 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Daniel Lemire <daniel@lemire.me> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 8718135 commit 4a1b51b

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
return false;
2727
}
2828

29-
*result = try_catch.Exception();
29+
*result = args[0];
3030
return true;
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+
const uint8_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+
const common = require('../common');
4+
5+
const test = require('node:test');
6+
const assert = require('node:assert');
7+
8+
test('TextDecoder correctly decodes windows-1252 encoded data', { skip: !common.hasIntl }, () => {
9+
const latin1Bytes = new Uint8Array([0xc1, 0xe9, 0xf3]);
10+
11+
const expectedString = 'Áéó';
12+
13+
const decoder = new TextDecoder('windows-1252');
14+
const decodedString = decoder.decode(latin1Bytes);
15+
16+
assert.strictEqual(decodedString, expectedString);
17+
});

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy