Skip to content

Commit 0025e48

Browse files
committed
src: coerce spawnSync args to string once
1 parent ff08094 commit 0025e48

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/spawn_sync.cc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,10 +1155,12 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11551155
if (!js_value->IsArray()) return Just<int>(UV_EINVAL);
11561156

11571157
Local<Context> context = env()->context();
1158-
js_array = js_value.As<Array>()->Clone().As<Array>();
1158+
js_array = js_value.As<Array>();
11591159
length = js_array->Length();
11601160
data_size = 0;
11611161

1162+
Local<String> values[length];
1163+
11621164
// Index has a pointer to every string element, plus one more for a final
11631165
// null pointer.
11641166
list_size = (length + 1) * sizeof *list;
@@ -1173,17 +1175,19 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11731175
return Nothing<int>();
11741176
}
11751177

1176-
if (!value->IsString()) {
1178+
if (value->IsString()) {
1179+
values[i] = value.As<String>();
1180+
} else {
11771181
Local<String> string;
11781182
if (!value->ToString(env()->isolate()->GetCurrentContext())
1179-
.ToLocal(&string) ||
1180-
js_array->Set(context, i, string).IsNothing()) {
1183+
.ToLocal(&string)) {
11811184
return Nothing<int>();
11821185
}
1186+
values[i] = string;
11831187
}
11841188

11851189
size_t maybe_size;
1186-
if (!StringBytes::StorageSize(isolate, value, UTF8).To(&maybe_size)) {
1190+
if (!StringBytes::StorageSize(isolate, values[i], UTF8).To(&maybe_size)) {
11871191
return Nothing<int>();
11881192
}
11891193
data_size += maybe_size + 1;
@@ -1197,14 +1201,10 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11971201

11981202
for (uint32_t i = 0; i < length; i++) {
11991203
list[i] = buffer + data_offset;
1200-
Local<Value> value;
1201-
if (!js_array->Get(context, i).ToLocal(&value)) {
1202-
return Nothing<int>();
1203-
}
12041204
data_offset += StringBytes::Write(isolate,
12051205
buffer + data_offset,
12061206
-1,
1207-
value,
1207+
values[i],
12081208
UTF8);
12091209
buffer[data_offset++] = '\0';
12101210
data_offset = nbytes::RoundUp(data_offset, sizeof(void*));
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
const common = require('../common');
3+
const { spawnSync } = require('child_process');
4+
const stateful = {
5+
toString: common.mustCall(() => ';'),
6+
};
7+
spawnSync(process.execPath, ['-e', stateful], { stdio: 'ignore' });

0 commit comments

Comments
 (0)