Skip to content

Commit d177541

Browse files
jasnelltargos
authored andcommitted
src: fix setting Converter sub char length
Signed-off-by: James M Snell <jasnell@gmail.com> Fixes: #38330 PR-URL: #38331 Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent e279b02 commit d177541

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/node_i18n.cc

+12-2
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,13 @@ MaybeLocal<Object> Transcode(Environment* env,
147147
*status = U_ZERO_ERROR;
148148
MaybeLocal<Object> ret;
149149
MaybeStackBuffer<char> result;
150-
Converter to(toEncoding, "?");
150+
Converter to(toEncoding);
151151
Converter from(fromEncoding);
152+
153+
size_t sublen = ucnv_getMinCharSize(to.conv());
154+
std::string sub(sublen, '?');
155+
to.set_subst_chars(sub.c_str());
156+
152157
const uint32_t limit = source_length * to.max_char_size();
153158
result.AllocateSufficientStorage(limit);
154159
char* target = *result;
@@ -189,7 +194,12 @@ MaybeLocal<Object> TranscodeFromUcs2(Environment* env,
189194
*status = U_ZERO_ERROR;
190195
MaybeStackBuffer<UChar> sourcebuf;
191196
MaybeLocal<Object> ret;
192-
Converter to(toEncoding, "?");
197+
Converter to(toEncoding);
198+
199+
size_t sublen = ucnv_getMinCharSize(to.conv());
200+
std::string sub(sublen, '?');
201+
to.set_subst_chars(sub.c_str());
202+
193203
const size_t length_in_chars = source_length / sizeof(UChar);
194204
CopySourceBuffer(&sourcebuf, source, source_length, length_in_chars);
195205
MaybeStackBuffer<char> destbuf(length_in_chars);

test/parallel/test-icu-transcode.js

+5
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,8 @@ assert.deepStrictEqual(
8383
const dest = buffer.transcode(new Uint8Array(), 'utf8', 'latin1');
8484
assert.strictEqual(dest.length, 0);
8585
}
86+
87+
// Test that it doesn't crash
88+
{
89+
buffer.transcode(new buffer.SlowBuffer(1), 'utf16le', 'ucs2');
90+
}

0 commit comments

Comments
 (0)