diff --git a/src/node_process_object.cc b/src/node_process_object.cc index 5f5af63486a5..185cc94ce205 100644 --- a/src/node_process_object.cc +++ b/src/node_process_object.cc @@ -26,6 +26,7 @@ using v8::None; using v8::Object; using v8::PropertyCallbackInfo; using v8::SideEffectType; +using v8::String; using v8::Value; static void ProcessTitleGetter(Local property, @@ -41,7 +42,13 @@ static void ProcessTitleGetter(Local property, static void ProcessTitleSetter(Local property, Local value, const PropertyCallbackInfo& info) { - node::Utf8Value title(info.GetIsolate(), value); + Isolate* isolate = info.GetIsolate(); + Local title_string; + if (!value->ToString(isolate->GetCurrentContext()).ToLocal(&title_string)) { + return; + } + + node::Utf8Value title(isolate, title_string); TRACE_EVENT_METADATA1( "__metadata", "process_name", "name", TRACE_STR_COPY(*title)); uv_set_process_title(*title); diff --git a/test/parallel/test-setproctitle.js b/test/parallel/test-setproctitle.js index 368bc85800a9..c2ad19756ef2 100644 --- a/test/parallel/test-setproctitle.js +++ b/test/parallel/test-setproctitle.js @@ -25,6 +25,20 @@ assert.notStrictEqual(process.title, title); process.title = title; assert.strictEqual(process.title, title); +assert.throws(() => { + process.title = Symbol(); +}, /^TypeError: Cannot convert a Symbol value to a string$/); +assert.strictEqual(process.title, title); + +assert.throws(() => { + process.title = { + toString() { + throw new Error('Cannot convert process title'); + }, + }; +}, /^Error: Cannot convert process title$/); +assert.strictEqual(process.title, title); + try { execSync('command -v ps'); } catch (err) {