OCaml versions 4.02.3 and earlier have a runtime bug that, on 64-bit platforms, causes sizes arguments to an internal memmove call to be sign-extended from 32 to 64-bits before being passed to the memmove function.
This leads arguments between 2GiB and 4GiB to be interpreted as larger than they are (specifically, a bit below 2^64), causing a buffer overflow.
Arguments between 4GiB and 6GiB are interpreted as 4GiB smaller than they should be, causing a possible information leak.
This commit fixes the bug: https://github.com/ocaml/ocaml/commit/659615c7b100a89eafe6253e7a5b9d84d0e8df74#diff-a97df53e3ebc59bb457191b496c90762 The function caml_bit_string is called indirectly from such functions as String.copy. String.copy for instance is supposed to be a "safe" function for which OCaml's memory safety guarantees apply.
{
"cwe": [
"CWE-119",
"CWE-200"
],
"human_link": "https://github.com/ocaml/security-advisories/tree/main/advisories/2016/OSEC-2016-01.md",
"osv": "https://github.com/ocaml/security-advisories/tree/generated-osv/2016/OSEC-2016-01.json"
}"https://github.com/ocaml/security-advisories/blob/generated-osv/2016/OSEC-2016-01.json"
[
{
"deprecated": false,
"digest": {
"line_hashes": [
"297134581783518190232305096955709827343",
"86702773046983713261411000937503317436",
"175354524405815385958652428238171284707",
"225813051060905969896847126940363767535",
"80947609156901628575749315377655207158",
"234546213613500856380613242533067117431",
"319675424272689619655773296571607687751",
"42618432546425227918416254476888121732"
],
"threshold": 0.9
},
"id": "OSEC-2016-01-39872619",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/ocaml/ocaml/commit/659615c7b100a89eafe6253e7a5b9d84d0e8df74",
"target": {
"file": "byterun/alloc.c"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"10052243845623888550354841528198123243",
"313133952579991044620704436137614753717",
"266752456972937092085304220901563235122",
"159846084899688354175353893237558839589"
],
"threshold": 0.9
},
"id": "OSEC-2016-01-7919b3a3",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/ocaml/ocaml/commit/659615c7b100a89eafe6253e7a5b9d84d0e8df74",
"target": {
"file": "byterun/intern.c"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"85424996336434796955035671983631143266",
"85551395679935241665303117152812282284",
"326958492464927746833064612802261356257",
"207772007117946504258662421451366370432",
"264253471812095600845252695062925757703",
"270191134296166034732436902130702877891",
"189680050811112729297100476753550978281",
"226231212319695106505871185064014352418"
],
"threshold": 0.9
},
"id": "OSEC-2016-01-d7e7e855",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/ocaml/ocaml/commit/659615c7b100a89eafe6253e7a5b9d84d0e8df74",
"target": {
"file": "byterun/str.c"
}
}
]
"2026-11-06T19:14:06Z"