@@ -1222,13 +1222,17 @@ static term do_spawn(Context *ctx, Context *new_ctx, size_t arity, size_t n_free
1222
1222
term link_term = interop_proplist_get_value (opts_term , LINK_ATOM );
1223
1223
term monitor_term = interop_proplist_get_value (opts_term , MONITOR_ATOM );
1224
1224
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 );
1226
1226
term group_leader ;
1227
+ bool valid_request = false;
1227
1228
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;
1229
1233
group_leader = term_get_tuple_element (request_term , 3 );
1230
1234
} else {
1231
- group_leader = ctx -> group_leader ;
1235
+ RAISE_ERROR ( BADARG_ATOM ) ;
1232
1236
}
1233
1237
1234
1238
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
1338
1342
term_put_tuple_element (pid_ref_tuple , 1 , ref );
1339
1343
1340
1344
return pid_ref_tuple ;
1341
- } else if (UNLIKELY (request_term != term_nil () )) {
1345
+ } else if (UNLIKELY (valid_request )) {
1342
1346
// Handling of spawn_request
1343
1347
// spawn_request requires that the reply is enqueued before
1344
1348
// any message from the spawned process
0 commit comments