Skip to content

Commit 1948de4

Browse files
committed
Merge pull request #1650 from bettio/check-before-using-tuple
NIFs: `do_spawn`: check if is tuple and arity before accessing it These changes are made under both the "Apache 2.0" and the "GNU Lesser General Public License 2.1 or later" license terms (dual license). SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
2 parents 16fdd83 + 5339702 commit 1948de4

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/libAtomVM/nifs.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,13 +1222,17 @@ static term do_spawn(Context *ctx, Context *new_ctx, size_t arity, size_t n_free
12221222
term link_term = interop_proplist_get_value(opts_term, LINK_ATOM);
12231223
term monitor_term = interop_proplist_get_value(opts_term, MONITOR_ATOM);
12241224
term heap_growth_strategy = interop_proplist_get_value_default(opts_term, ATOMVM_HEAP_GROWTH_ATOM, BOUNDED_FREE_ATOM);
1225-
term request_term = interop_proplist_get_value(opts_term, REQUEST_ATOM);
1225+
term request_term = interop_proplist_get_value_default(opts_term, REQUEST_ATOM, UNDEFINED_ATOM);
12261226
term group_leader;
1227+
bool valid_request = false;
12271228

1228-
if (UNLIKELY(request_term != term_nil())) {
1229+
if (LIKELY(request_term == UNDEFINED_ATOM)) {
1230+
group_leader = ctx->group_leader;
1231+
} else if (term_is_tuple(request_term) && (term_get_tuple_arity(request_term) >= 5)) {
1232+
valid_request = true;
12291233
group_leader = term_get_tuple_element(request_term, 3);
12301234
} else {
1231-
group_leader = ctx->group_leader;
1235+
RAISE_ERROR(BADARG_ATOM);
12321236
}
12331237

12341238
if (min_heap_size_term != term_nil()) {
@@ -1338,7 +1342,7 @@ static term do_spawn(Context *ctx, Context *new_ctx, size_t arity, size_t n_free
13381342
term_put_tuple_element(pid_ref_tuple, 1, ref);
13391343

13401344
return pid_ref_tuple;
1341-
} else if (UNLIKELY(request_term != term_nil())) {
1345+
} else if (UNLIKELY(valid_request)) {
13421346
// Handling of spawn_request
13431347
// spawn_request requires that the reply is enqueued before
13441348
// any message from the spawned process

0 commit comments

Comments
 (0)