src: use RAII for uv_process_options_t · nodejs/node@415fff2 · GitHub
Skip to content

Commit 415fff2

Browse files
iknoomtargos
authored andcommitted
src: use RAII for uv_process_options_t
PR-URL: #59945 Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 66d90b8 commit 415fff2

3 files changed

Lines changed: 64 additions & 73 deletions

File tree

src/process_wrap.cc

Lines changed: 40 additions & 43 deletions

src/spawn_sync.cc

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,6 @@ void SyncProcessRunner::Spawn(const FunctionCallbackInfo<Value>& args) {
403403
args.GetReturnValue().Set(result);
404404
}
405405

406-
407406
SyncProcessRunner::SyncProcessRunner(Environment* env)
408407
: max_buffer_(0),
409408
timeout_(0),
@@ -412,14 +411,9 @@ SyncProcessRunner::SyncProcessRunner(Environment* env)
412411
uv_loop_(nullptr),
413412

414413
stdio_count_(0),
415-
uv_stdio_containers_(nullptr),
416414
stdio_pipes_initialized_(false),
417415

418416
uv_process_options_(),
419-
file_buffer_(nullptr),
420-
args_buffer_(nullptr),
421-
env_buffer_(nullptr),
422-
cwd_buffer_(nullptr),
423417

424418
uv_process_(),
425419
killed_(false),
@@ -436,19 +430,12 @@ SyncProcessRunner::SyncProcessRunner(Environment* env)
436430

437431
lifecycle_(kUninitialized),
438432

439-
env_(env) {
440-
}
441-
433+
env_(env) {}
442434

443435
SyncProcessRunner::~SyncProcessRunner() {
444436
CHECK_EQ(lifecycle_, kHandlesClosed);
445437

446438
stdio_pipes_.clear();
447-
delete[] file_buffer_;
448-
delete[] args_buffer_;
449-
delete[] cwd_buffer_;
450-
delete[] env_buffer_;
451-
delete[] uv_stdio_containers_;
452439
}
453440

454441

@@ -808,12 +795,14 @@ Maybe<int> SyncProcessRunner::ParseOptions(Local<Value> js_value) {
808795
Local<Object> js_options = js_value.As<Object>();
809796

810797
Local<Value> js_file;
798+
const char* file_buffer;
811799
if (!js_options->Get(context, env()->file_string()).ToLocal(&js_file) ||
812-
!CopyJsString(js_file, &file_buffer_).To(&r)) {
800+
!CopyJsString(js_file, &file_buffer).To(&r)) {
813801
return Nothing<int>();
814802
}
815803
if (r < 0) return Just(r);
816-
uv_process_options_.file = file_buffer_;
804+
file_buffer_.reset(file_buffer);
805+
uv_process_options_.file = file_buffer_.get();
817806

818807
// Undocumented feature of Win32 CreateProcess API allows spawning
819808
// batch files directly but is potentially insecure because arguments
@@ -825,23 +814,27 @@ Maybe<int> SyncProcessRunner::ParseOptions(Local<Value> js_value) {
825814
#endif
826815

827816
Local<Value> js_args;
817+
char* args_buffer;
828818
if (!js_options->Get(context, env()->args_string()).ToLocal(&js_args) ||
829-
!CopyJsStringArray(js_args, &args_buffer_).To(&r)) {
819+
!CopyJsStringArray(js_args, &args_buffer).To(&r)) {
830820
return Nothing<int>();
831821
}
832822
if (r < 0) return Just(r);
833-
uv_process_options_.args = reinterpret_cast<char**>(args_buffer_);
823+
args_buffer_.reset(args_buffer);
824+
uv_process_options_.args = reinterpret_cast<char**>(args_buffer_.get());
834825

835826
Local<Value> js_cwd;
836827
if (!js_options->Get(context, env()->cwd_string()).ToLocal(&js_cwd)) {
837828
return Nothing<int>();
838829
}
839830
if (!js_cwd->IsNullOrUndefined()) {
840-
if (!CopyJsString(js_cwd, &cwd_buffer_).To(&r)) {
831+
const char* cwd_buffer;
832+
if (!CopyJsString(js_cwd, &cwd_buffer).To(&r)) {
841833
return Nothing<int>();
842834
}
843835
if (r < 0) return Just(r);
844-
uv_process_options_.cwd = cwd_buffer_;
836+
cwd_buffer_.reset(cwd_buffer);
837+
uv_process_options_.cwd = cwd_buffer_.get();
845838
}
846839

847840
Local<Value> js_env_pairs;
@@ -850,12 +843,13 @@ Maybe<int> SyncProcessRunner::ParseOptions(Local<Value> js_value) {
850843
return Nothing<int>();
851844
}
852845
if (!js_env_pairs->IsNullOrUndefined()) {
853-
if (!CopyJsStringArray(js_env_pairs, &env_buffer_).To(&r)) {
846+
char* env_buffer;
847+
if (!CopyJsStringArray(js_env_pairs, &env_buffer).To(&r)) {
854848
return Nothing<int>();
855849
}
856850
if (r < 0) return Just(r);
857-
858-
uv_process_options_.env = reinterpret_cast<char**>(env_buffer_);
851+
env_buffer_.reset(env_buffer);
852+
uv_process_options_.env = reinterpret_cast<char**>(env_buffer_.get());
859853
}
860854
Local<Value> js_uid;
861855
if (!js_options->Get(context, env()->uid_string()).ToLocal(&js_uid)) {
@@ -982,7 +976,7 @@ Maybe<int> SyncProcessRunner::ParseStdioOptions(Local<Value> js_value) {
982976
js_stdio_options = js_value.As<Array>();
983977

984978
stdio_count_ = js_stdio_options->Length();
985-
uv_stdio_containers_ = new uv_stdio_container_t[stdio_count_];
979+
uv_stdio_containers_.resize(stdio_count_);
986980

987981
stdio_pipes_.clear();
988982
stdio_pipes_.resize(stdio_count_);
@@ -1007,7 +1001,7 @@ Maybe<int> SyncProcessRunner::ParseStdioOptions(Local<Value> js_value) {
10071001
}
10081002
}
10091003

1010-
uv_process_options_.stdio = uv_stdio_containers_;
1004+
uv_process_options_.stdio = uv_stdio_containers_.data();
10111005
uv_process_options_.stdio_count = stdio_count_;
10121006

10131007
return Just<int>(0);

src/spawn_sync.h

Lines changed: 5 additions & 5 deletions

0 commit comments

Comments
 (0)