mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
process_wrap: avoid leaking memory when throwing due to invalid arguments
This commit is contained in:
1 parent
55e4d54927
commit
3546383cf0
1 file changed
+30
-30
+30
-30
@@ -105,6 +105,36 @@ class ProcessWrap : public HandleWrap {
|
||||
|
||||
options.exit_cb = OnExit;
|
||||
|
||||
// options.uid
|
||||
Local<Value> uid_v = js_options->Get(String::NewSymbol("uid"));
|
||||
if (uid_v->IsInt32()) {
|
||||
int32_t uid = uid_v->Int32Value();
|
||||
if (uid & ~((uv_uid_t) ~0)) {
|
||||
return ThrowException(Exception::RangeError(
|
||||
String::New("options.uid is out of range")));
|
||||
}
|
||||
options.flags |= UV_PROCESS_SETUID;
|
||||
options.uid = (uv_uid_t) uid;
|
||||
} else if (!uid_v->IsUndefined() && !uid_v->IsNull()) {
|
||||
return ThrowException(Exception::TypeError(
|
||||
String::New("options.uid should be a number")));
|
||||
}
|
||||
|
||||
// options.gid
|
||||
Local<Value> gid_v = js_options->Get(String::NewSymbol("gid"));
|
||||
if (gid_v->IsInt32()) {
|
||||
int32_t gid = gid_v->Int32Value();
|
||||
if (gid & ~((uv_gid_t) ~0)) {
|
||||
return ThrowException(Exception::RangeError(
|
||||
String::New("options.gid is out of range")));
|
||||
}
|
||||
options.flags |= UV_PROCESS_SETGID;
|
||||
options.gid = (uv_gid_t) gid;
|
||||
} else if (!gid_v->IsUndefined() && !gid_v->IsNull()) {
|
||||
return ThrowException(Exception::TypeError(
|
||||
String::New("options.gid should be a number")));
|
||||
}
|
||||
|
||||
// TODO is this possible to do without mallocing ?
|
||||
|
||||
// options.file
|
||||
@@ -182,36 +212,6 @@ class ProcessWrap : public HandleWrap {
|
||||
options.flags |= UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS;
|
||||
}
|
||||
|
||||
// options.uid
|
||||
Local<Value> uid_v = js_options->Get(String::NewSymbol("uid"));
|
||||
if (uid_v->IsInt32()) {
|
||||
int32_t uid = uid_v->Int32Value();
|
||||
if (uid & ~((uv_uid_t) ~0)) {
|
||||
return ThrowException(Exception::RangeError(
|
||||
String::New("options.uid is out of range")));
|
||||
}
|
||||
options.flags |= UV_PROCESS_SETUID;
|
||||
options.uid = (uv_uid_t) uid;
|
||||
} else if (!uid_v->IsUndefined() && !uid_v->IsNull()) {
|
||||
return ThrowException(Exception::TypeError(
|
||||
String::New("options.uid should be a number")));
|
||||
}
|
||||
|
||||
// options.gid
|
||||
Local<Value> gid_v = js_options->Get(String::NewSymbol("gid"));
|
||||
if (gid_v->IsInt32()) {
|
||||
int32_t gid = gid_v->Int32Value();
|
||||
if (gid & ~((uv_gid_t) ~0)) {
|
||||
return ThrowException(Exception::RangeError(
|
||||
String::New("options.gid is out of range")));
|
||||
}
|
||||
options.flags |= UV_PROCESS_SETGID;
|
||||
options.gid = (uv_gid_t) gid;
|
||||
} else if (!gid_v->IsUndefined() && !gid_v->IsNull()) {
|
||||
return ThrowException(Exception::TypeError(
|
||||
String::New("options.gid should be a number")));
|
||||
}
|
||||
|
||||
int r = uv_spawn2(uv_default_loop(), &wrap->process_, options);
|
||||
|
||||
if (r) {
|
||||
|
||||
Reference in new issue
Block a user