Skip to content

Commit 358cd7c

Browse files
authored
Ensure root safety in caml_register_named_value. (#3656)
* Ensure root safety in caml_register_named_value. * Remove unused variable.
1 parent 0703b41 commit 358cd7c

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

runtime/callback.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -447,16 +447,18 @@ static unsigned int hash_value_name(char const *name)
447447

448448
CAMLprim value caml_register_named_value(value vname, value val)
449449
{
450+
CAMLparam2(vname, val);
450451
const char * name = String_val(vname);
451452
size_t namelen = strlen(name);
452453
unsigned int h = hash_value_name(name);
453454
int found = 0;
454455

455456
caml_plat_lock_non_blocking(&named_value_lock);
457+
name = NULL; /* block may have moved while we waited for the lock. */
456458
for (struct named_value *nv = named_value_table[h];
457459
nv != NULL;
458460
nv = nv->next) {
459-
if (strcmp(name, nv->name) == 0) {
461+
if (strcmp(String_val(vname), nv->name) == 0) {
460462
caml_modify_generational_global_root(&nv->val, val);
461463
found = 1;
462464
break;
@@ -465,14 +467,14 @@ CAMLprim value caml_register_named_value(value vname, value val)
465467
if (!found) {
466468
struct named_value *nv = (struct named_value *)
467469
caml_stat_alloc(sizeof(struct named_value) + namelen);
468-
memcpy(nv->name, name, namelen + 1);
470+
memcpy(nv->name, String_val(vname), namelen + 1);
469471
nv->val = val;
470472
nv->next = named_value_table[h];
471473
named_value_table[h] = nv;
472474
caml_register_generational_global_root(&nv->val);
473475
}
474476
caml_plat_unlock(&named_value_lock);
475-
return Val_unit;
477+
CAMLreturn(Val_unit);
476478
}
477479

478480
CAMLexport const value* caml_named_value(char const *name)

runtime/signals.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ static int caml_set_signal_action(int signo, int action)
703703
CAMLprim value caml_install_signal_handler(value signal_number, value action)
704704
{
705705
CAMLparam2 (signal_number, action);
706-
CAMLlocal2 (res, tmp_signal_handlers);
706+
CAMLlocal1 (res);
707707
int sig, act, oldact;
708708

709709
sig = caml_convert_signal_number(Int_val(signal_number));

0 commit comments

Comments
 (0)