[OCaml] Fix a possible crash in llvm_struct_name
authorJosh Berdine <josh@berdine.net>
Thu, 25 Mar 2021 23:34:04 +0000 (23:34 +0000)
committerJosh Berdine <josh@berdine.net>
Fri, 26 Mar 2021 11:49:13 +0000 (11:49 +0000)
commit6f77926f464b6834339895e295f295953686af22
treeef98062681b9f0f34a1cef02e2799ef1d7c66478
parent0b1dc49ca38a8569b0aee40ea8d3054bc960e2ed
[OCaml] Fix a possible crash in llvm_struct_name

The implementation of `llvm_struct_name` before this diff calls
`caml_copy_string`, which allocates, while the `result` local variable
points to a block allocated by `caml_alloc_small` that has not yet
been initialized. If the allocation in `caml_copy_string` triggers a
garbage collection, then the GC root `result` contains a pointer to
uninitialized data, which may crash the GC or lead to a memory
corruption.

This diff fixes this by allocating and initializing the string first
and then allocating and initializing the option, thereby leaving no
dangling pointers when allocations are made.

The conversion from a C string to an OCaml string option is refactored
into a function, `cstr_to_string_option`. This function is also used
to simplify the definitions of `llvm_get_mdstring` and
`llvm_string_of_const`.

Differential Revision: https://reviews.llvm.org/D99393
llvm/bindings/ocaml/llvm/llvm_ocaml.c