Skip to content

Segfault or infinite loop in 'caml_unregister_frametable'  #11633

@recoules

Description

@recoules

Dear developers,

I am playing with JIT, compiling small codes, registering and unregistering frame tables.
Usually, when something goes wrong, it is because I messed with the runtime, but this time, it seems there is a possible bug in the function caml_unregister_frametable:

ocaml/runtime/roots_nat.c

Lines 208 to 229 in 679b500

void caml_unregister_frametable(intnat *table) {
intnat len, j;
link *lnk;
link *previous = frametables;
frame_descr * d;
len = *table;
d = (frame_descr *)(table + 1);
for (j = 0; j < len; j++) {
remove_entry(d);
d = next_frame_descr(d);
}
iter_list(frametables,lnk) {
if(lnk->data == table) {
previous->next = lnk->next;
caml_stat_free(lnk);
break;
}
previous = lnk;
}
}

For me, it does not take into account that the root of the list (frametables) can be the one we "unregister".
Thus, I would make the following changes at lines 221-228:

if (frametables->data == table) {
  lnk = frametables;
  frametables = frametables->next;
  caml_stat_free(lnk); 
} else {
  iter_list(frametables->next,lnk) { 
     if(lnk->data == table) { 
       previous->next = lnk->next; 
       caml_stat_free(lnk); 
       break; 
     } 
     previous = lnk; 
   }
}

Regards,

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions