From: Alan Schmitt <alan.schmitt@polytechnique.org>
To: caml-list@inria.fr
Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News
Date: Tue, 27 Oct 2026 11:29:17 +0100 [thread overview]
Message-ID: <m2y0bjjv2a.fsf@mac-03220211.irisa.fr> (raw)
[-- Attachment #1: Type: text/plain, Size: 72902 bytes --]
Hello
Here is the latest OCaml Weekly News, for the week of October 20 to 27,
2026.
(Due to its large size, this week's CWN is only sent in text format.)
Table of Contents
─────────────────
uniker.nl - Unikernels in OCaml
Announcing segmap, a fast data structure for renamings
hexen.0.1
intel_hex.1.0
Js_of_ocaml / Wasm_of_ocaml 6.5
TIFF Inspector: an ocaml-tiff based inspector, with an in-browser OCaml playground
OCaml 5.5.2 released
bytream.0.4
First release of spvec
ocaml-emcc: compile OCaml programs with their C stubs to WebAssembly
New release of snkv-ocaml 0.3.0 — OCaml bindings for SNKV with HNSW vector search
Building TIFF Inspector: Exploring OCaml, TIFF Internals, and an In-Browser Playground
stele 0.1.0: syntax-error messages for Menhir grammars
OSEC-2026-21: Str partial-match stale capture registers underflow
OSEC-2026-22: Integer overflow in Unix.map_file
OSEC-2026-23: Multiple issues in Marshal
OSEC-2026-24: Multiple issues in command quoting on Windows
OSEC-2026-25: Heap buffer overflow in the OCaml `runtime_events' consumer when parsing an oversized custom user event
OSEC-2026-26: runtime_events user event name-based type confusion
Old CWN
uniker.nl - Unikernels in OCaml
═══════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-uniker-nl-unikernels-in-ocaml/18625/1>
Calascibetta Romain announced
─────────────────────────────
We are delighted to announce the launch of our new website:
[uniker.nl]. This website embodies our new approach to developing
unikernels with OCaml 5. It offers a new way of developing unikernels
and now places just as much emphasis on the deployment and use of
unikernels. The website features a comprehensive [tutorial] and
resources to help you get to grips with our new ecosystem, providing a
_first entry point_ for anyone interested in unikernels in OCaml.
The content of this site is available [here], is powered by the
excellent [YOCaml] project, and is deployed using our [immuable]
unikernel.
[uniker.nl] <https://uniker.nl/>
[tutorial] <https://uniker.nl/introduction/>
[here] <https://github.com/robur-coop/uniker.nl>
[YOCaml] <https://yocaml.github.io/tutorial/index.html>
[immuable] <https://github.com/dinosaure/immuable>
Our new ecosystem
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
We were able to present our new workflow at the [OCaml Workshop 2026]
([slides]) and our approach can be summarised in two main points:
• the development of unikernels
• the deployment of unikernels and their uses
[OCaml Workshop 2026] <https://ocaml.org/ocaml-workshop-2026>
[slides]
<https://docs.google.com/presentation/d/1bOXJAPEEjPBx_8i0frThKhLpHd8C7-EPRczEQjvz6JU/edit?slide=id.g3f7268904c5_0_1#slide=id.g3f7268904c5_0_1>
◊ To develop unikernels
Our co-operative has been developing unikernels for quite a few years
now. [Our blog] showcases some of the ones we use for our
infrastructure. Based on our experience, we are well aware of the
constraints and limitations of what we can achieve when it comes to
developing an application in the form of a unikernel. The best-known
constraint we have accepted is not to require the POSIX interface (nor
to attempt to replicate it) in terms of protocols and formats. One of
the rules still adhered to today is, amongst other things, [not to
depend on I/O or a scheduler][1] when providing implementations.
Building on this experience, we have been able to develop protocols
and formats that are currently being used by others in contexts other
than unikernels.
However, we have also seen the limits of what we can achieve,
particularly with what MirageOS currently offers. With this in mind,
and upon further reflection on the constraints we face when developing
unikernels (particularly regarding cross-compilation), we have decided
to structure the development of unikernels using two tools:
[~unic~](how to infer dependencies and _vendor_ them) and
[~mfetch~](how to vendor dependencies).
[Our blog] <https://blog.robur.coop/>
[not to depend on I/O or a scheduler]
<https://discuss.ocaml.org/t/on-concurrency-models/15899/13>
[1]
<https://discuss.ocaml.org/t/why-ocsigen-is-staying-on-lwt-for-now/18318/27>
◊ [`unic']: how to infer dependencies and _vendor_ them
One constraint we face with unikernels is the need to recompile C
files with specific options so that they do not depend on what already
exists on the host system. The approach taken by MirageOS 3 was to
distribute the result of this specific compilation within libraries
that contain C stubs (such as [`digestif'] or [`mirage-crypto']). The
problem is that we were forcing users of these libraries to install
[`ocaml-solo5'] in order to obtain a compilation environment for C
files specific to [Solo5], our core component for producing
unikernels.
MirageOS 4 then arrived with `dune' and its contexts, allowing us to
achieve a consistent compilation environment for C files. However,
this approach introduced new a constraint: all dependencies of our
unikernels had to use `dune', which is *legitimately* not the case in
the OCaml ecosystem.
It is for this reason that we decided to refine the need to recompile
some of our libraries a little further and, finally, to be able to
capitalise on a key advantage of [`ocaml-solo5'], namely that
compiling OCaml files with this compiler produces exactly the same
result as if you were using your host OCaml compiler: in other words,
and as has been the case from the beginning, we strictly only need to
cross-compile the C files.
It is therefore at the intersection of these two features (only
needing to cross-compile the C files and being able to reuse libraries
written in pure OCaml and compiled with the host compiler) that we can
offer users the ability to write this sort of code without involving
any maintenance work on libraries that do not use `dune' and without
necessarily having to recompile everything:
┌────
│ $ opam install unic
│ $ cat >main.ml<<EOF
│ > open Digestif
│
│ > let () = Mkernel.run [] @@ fun () ->
│ > Fmt.pr "%a\n%!" SHA1.pp (SHA1.digest_string "Hello World!")
│ > EOF
│ $ unic infer -r .
│ Module Digestif is provided by several ocamlfind packages:
│ [0] digestif.c
│ [1] digestif.ocaml
│ Pick one [0-1]: 0
│ digestif
│ mkernel
│ $ opam source digestif
│ $ opam source mkernel
│ $ dune build
│ $ solo5-hvt -- _build/solo5/main.exe --solo5:quiet
│ 2ef7bde608ce5404e97d5f042f95f89f1c232871Solo5
└────
`unic' is therefore a tool capable of inferring the dependencies of an
OCaml project without using a specific build system, and of
calculating what needs to be cross-compiled (in this case `digestif'
and `mkernel' but not `fmt') to produce a unikernel. The project
serves our purpose first and foremost, but it is worth noting that it
can also be useful when compiling statically linked executables.
This tool offers a whole range of sub-tools for analysing META files,
viewing an artefact from different perspectives (its module name, its
`ocamlfind' package name and its OPAM package name) or analysing OCaml
artefacts (such as `*.cmxa' files).
We would particularly like to thank @Octachron for his [`codept']
project (on which `unic' is based) and for working with us to improve
it.
[`unic'] <https://github.com/robur-coop/unic>
[`digestif'] <https://github.com/mirage/digestif>
[`mirage-crypto'] <https://github.com/mirage/mirage-crypto>
[`ocaml-solo5'] <https://github.com/mirage/ocaml-solo5>
[Solo5] <https://github.com/solo5/solo5>
[`codept'] <https://github.com/Octachron/codept>
◊ [`mfetch']: how to vendor dependencies
Having identified more precisely which dependencies need to be
cross-compiled, we now need to download these dependencies. Although
`opam source' does the job very well, we wanted a tool that could
download the source code from various types of source, such as:
• from a _tarball_, as is usually the case
• but also from a Git repository
• or even from a specific location on your file system
That is why we developed `mfetch', which allows you to download
software sources based on information provided by OPAM or the user,
and to create a `vendors' folder containing all these sources.
┌────
│ $ unic infer -r . -o _mfetch
│ $ mfetch --with-dune-file
│ digestif │██████████████████│ 3.1 MiB / 3.1 MiB 5.9 MiB/s
│ mkernel │██████████████████│ 37.3 KiB / 37.3 KiB 3.4 MiB/s
│
│ digestif ok
│ mkernel ok
│ $ dune build
└────
`mfetch' also allows you to check whether you have modified any of the
source files (for a bug fix) or to generate a `*.locked' file so that
you can then verify the reproducibility of your unikernel using our
other tool [`orb']. The tool itself is not revolutionary, but it helps
to streamline the workflow.
┌────
│ $ mfetch status
│ digestif ok
│ mkernel ok
│ $ mfetch lock
│ 2 sources locked into _mfetch.locked
└────
[`mfetch'] <https://github.com/robur-coop/mfetch>
[`orb'] <https://github.com/robur-coop/orb>
◊ Libraries for OCaml 5
Our new workflow now uses OCaml 5. As well as updating the basic
building blocks required to produce unikernels with OCaml 5, we have
also developed a series of libraries that primarily enable us to take
advantage of effects. Furthermore, over the past several years we have
developed:
• [Miou], our scheduler for OCaml 5
• [`mkernel'], a derivative of our Miou scheduler designed to handle
the I/O provided by Solo5
• [`mnet'], a reimplementation of the TCP/IP stack (using [`utcp']) in
OCaml with effects
• and plenty of other libraries such as [`mhttp'], [`msendmail'],
[`mfat'], [`vifu'], etc.
These libraries, currently used by some of our deployed unikernels,
allow us to offer developers a _direct-style_ approach to implementing
their unikernels.
But what is key to take away from this emerging ecosystem is the
retrospective analysis of past projects to ensure we do not repeat the
same mistakes. We very quickly realised that it could be very
difficult to migrate existing libraries using [`lwt'] (the MirageOS
scheduler) to Miou (or any other scheduler using effects). We
therefore took the opportunity not only to propose a _direct-style_
approach using Miou, but also to rethink the implementation of our
libraries in light of what we've learnt from deploying unikernels with
MirageOS. We have paid particular attention to memory usage, to
avoiding known CVEs from our previous implementations (as we are also
part of the OCaml security team), and also to offering an alternative
API that does not systematically rely on functors.
The approach is still experimental, as we need to consolidate this new
ecosystem across several layers, but we are firmly convinced (based on
what we've observed in our deployed unikernels) that these new
implementations are significantly better than what we used in the
past.
[Miou]
<https://discuss.ocaml.org/t/ann-miou-a-simple-scheduler-for-ocaml-5/12963>
[`mkernel'] <https://github.com/robur-coop/mkernel>
[`mnet']
<https://discuss.ocaml.org/t/ann-mnet-a-new-tcp-ip-stack-for-unikernels-in-ocaml/17851>
[`utcp'] <https://github.com/robur-coop/utcp>
[`mhttp'] <https://github.com/robur-coop/mhttp>
[`msendmail'] <https://github.com/robur-coop/colombe>
[`mfat'] <https://github.com/robur-coop/mfat>
[`vifu'] <https://github.com/robur-coop/vif>
[`lwt'] <https://github.com/ocsigen/lwt>
◊ To deploy unikernels
The other side of unikernels is deployment. Indeed, it is not just a
matter of developing unikernels (and making their development easier)
but also of deploying and using them. Our main objective remains to
replace existing services with unikernels (name servers, websites,
time servers, etc.), and the way to compete with existing
infrastructure is to actively deploy and use our unikernels.
That is why we have developed two projects:
• [Albatross], an OCaml service for launching unikernels
• [Aussi], an OCI runtime for Solo5
We mainly use Albatross in conjunction with our infrastructure for
verifying the reproducibility of our unikernels:
[builds.robur.coop]. In this way, we can trace the dependencies of the
unikernels - particularly their CVEs - and ensure supply-chain
security.
Next comes deployment, and we are therefore seeking to integrate our
unikernels into existing infrastructure and provide ways of monitoring
them, in particular using [InfluxDB], [Telegraf] and [Grafana].
This is how we are able to offer services such as (note that some
haven't yet been ported to `mkernel~/~mnet', but will be soon):
• simple websites such as our <https://blog.robur.coop/> (using
[`unipi'] or [`immuable'])
• domain name management for domains such as `robur.coop', `reyn.ir'
or `din.osau.re' (via our [primary] DNS server and [secondary]
server)
• a VPN service, whether using [MirageVPN] or [Zostera]
• a time server (using [Chaos]): <https://chaos.osau.re/>
• a [CalDAV] calendar system
• [a mailing list] using the [`ptt'] project
• a TLS termination proxy such as [`tlstunnel'] or [`contruno'] (used
by sherlocode.com)
• and many more!
It is therefore through actual use that we improve our unikernels and
the libraries that depend on them. That is why part of our tutorial
also focuses on deploying unikernels, so that you can use them and
help us with your feedback.
Finally, we are also proposing a project called [Mollymawk], designed
to simplify the deployment of unikernels via a web interface, so that,
in future, we can offer access to our infrastructure to anyone who
wishes to use it (and we would like to thank @kit-ty-kate for their
various attempts).
[Albatross] <https://github.com/robur-coop/albatross>
[Aussi] <https://github.com/robur-coop/aussi>
[builds.robur.coop] <https://builds.robur.coop>
[InfluxDB] <https://www.influxdata.com/>
[Telegraf] <https://www.influxdata.com/time-series-platform/telegraf/>
[Grafana] <https://grafana.com/>
[`unipi'] <https://github.com/robur-coop/unipi>
[`immuable'] <https://github.com/dinosaure/immuable>
[primary] <https://github.com/robur-coop/dns-primary-git/>
[secondary] <https://git.robur.coop/robur/dns-secondary/>
[MirageVPN] <https://github.com/robur-coop/miragevpn>
[Zostera] <https://github.com/robur-coop/zostera>
[Chaos] <https://github.com/robur-coop/chaos>
[CalDAV] <https://github.com/robur-coop/caldav>
[a mailing list] <https://mailingl.st>
[`ptt'] <https://github.com/robur-coop/ptt>
[`tlstunnel'] <https://github.com/robur-coop/tlstunnel>
[`contruno'] <https://github.com/robur-coop/contruno>
[Mollymawk] <https://mollymawk.robur.coop/>
About us
╌╌╌╌╌╌╌╌
Finally, none of this would be possible without our co-operative and
the way we organise our work. You can view the details of our finances
[here]. We accept donations and have recently secured funding from
NLnet. Private companies such as [Ahrefs] and [Tarides] also sponsor
our work. We also have partnerships with [OCamlPro] and the [OCaml
Foundation]. And we contribute to the OCaml ecosystem on a daily basis
by working with individuals and companies.
You can find more details on [our website]. We would like to emphasise
that it is thanks to our structure (that of an association) that we
are able to carry out this work, and we would like to thank our
sponsors.
[here] <https://blog.robur.coop/articles/finances.html>
[Ahrefs] <https://ahrefs.com/>
[Tarides] <https://tarides.com/>
[OCamlPro] <https://ocamlpro.com>
[OCaml Foundation] <https://ocaml-sf.org/>
[our website] <https://robur.coop/>
Unikernels and MirageOS
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Enthusiasts may wonder what the advantage of our approach is compared
to MirageOS, a unikernel project that remains active thanks to our
maintenance work. Our approach is characterised by five points that we
have identified as glass ceilings to the adoption of unikernels:
• the first concerns the use of [`ocaml-cstruct']. The fundamental
issue remains the use of `bigarray' as _buffer_ instead of
`bytes~/~string'. Our experience whilst developing [MirageVPN] has
shown us that using `cstruct' as a systematic library for the
_buffer_ concept across our entire ecosystem was our biggest
*penalty* in terms of throughput for our unikernel. This is why we
decided not only to develop [`bstr'] and [`slice'], but also to
rewrite the majority of our libraries by replacing `cstruct' with
`bytes~/~string' (this was the case for [`ocaml-tls'],
[`mirage-crypto'], [`ocaml-dns'] and, more recently, [`awa-ssh'] and
[`utcp']). The conclusion is quite simple: it is not a question of
stopping using bigarray, but rather of not making their use
systematic in our APIs.
• the second point concerns the use of functors to express the devices
required by the unikernel. The approach of reusing interfaces to
inject specific implementations that concretize these devices via
functors may seem appealing, but the maintenance cost of such an
ecosystem—constrained by interfaces that are no longer really up to
date with new concepts—has led us into [absurd situations] whenever
we've needed to develop more specific unikernels tailored to our
requirements. Once again, the rule is not to stop using functors,
but not to make their use systematic.
• the third point concerns the compilation of unikernels. MirageOS
relies on a workaround that, even today, integrates very poorly with
`dune'; this can be defined as: _multi-stage compilation_, where a
code-generation phase is required depending on the desired
_target_. This way of structuring the workflow with a set of
dependencies dictated by the tool explicitly restricts the developer
in what they wish to do and how they wish to do it. Although there
are constraints on compiling a unikernel (such as not using the
`Unix' module), our cooperative has decided to provide *informative*
(and not prescriptive) tools that assist (but do not force) the user
in designing their unikernel (furthermore, we are also delighted to
introduce [`unic'] and [`mfetch']). The key point of our new
approach is to ensure that it is the user who has the final say,
rather than the tool (in this case, `mirage'), in the development of
unikernels.
It is very intricate on what the `mirage' tool does, including
generation of functor applications and some initialization stubs, as
well as opam version constraints (since the functors and
initialization functions may change in new opam packages). The
`mirage' tool has a closed world assumption, and it is hard to use a
package not known by `mirage' - it is as well very hard to use
`js_of_ocaml' in a `mirage' unikernel.
• the fourth point concerns the maintenance of this ecosystem, and
specifically the maintenance of the tools and libraries on which
MirageOS relies. Furthermore, we have experienced some
disappointments with `opam-monorepo', and we are finding, day by
day, that it is becoming increasingly difficult to update
`mirage-tcpip' in line with OCaml 5. Our involvement in the OCaml
security team has also led us to wish to deprecate certain libraries
due to a lack of maintenance. We are therefore refocusing our
ecosystem on what our co-operative produces and maintains.
• Finally, the last point concerns our work with the community, which
remains unchanged despite the emergence of AI. We have observed a
certain abusive use of AI to solve non-existent problems relating to
unikernels, which, in our view, undermines our credibility regarding
the security, maintenance and quality of our software. In this
regard, we are trying to distance ourselves from those who prefer
_vibe-coding_ rather than deployment. This approach is reflected in
our use of the [AGPL] as our licence (whilst offering the option of
dual licensing) and a [POLICY] regarding the use of AI.
All of this has led us to propose MirageOS 5, which represents a
fundamental departure from the factors that characterised the failure
of MirageOS 4 (for which I was the release manager). It is therefore,
having acknowledged this defeat (and analysed it), that we are
proposing a new approach to creating and deploying unikernels:
[uniker.nl].
As regards the projects associated with the MirageOS project, we will,
of course, continue to maintain some of them, whilst at the same time
offering more up-to-date solutions to those who use some of our
libraries. We would also be delighted to help anyone wishing to
migrate to our new libraries and tools; we are (as we always have
been) available to assist.
[`ocaml-cstruct'] <https://github.com/mirage/ocaml-cstruct>
[MirageVPN] <https://github.com/robur-coop/miragevpn>
[`bstr'] <https://github.com/robur-coop/bstr>
[`slice'] <https://github.com/robur-coop/bstr>
[`ocaml-tls'] <https://github.com/mirleft/ocaml-tls/pull/497>
[`mirage-crypto'] <https://github.com/mirage/mirage-crypto/pull/214>
[`ocaml-dns'] <https://github.com/mirage/ocaml-dns/pull/351>
[`awa-ssh'] <https://github.com/mirage/awa-ssh/pull/85>
[`utcp'] <https://github.com/robur-coop/utcp/pull/55>
[absurd situations]
<https://github.com/robur-coop/dnsvizor/blob/83b32596c4a08c080067e1cd36fe5788b90cdd78/unikernel.ml#L610-L631>
[`unic'] <https://github.com/robur-coop/unic>
[`mfetch'] <https://github.com/robur-coop/mfetch>
[AGPL] <https://www.gnu.org/licenses/agpl-3.0.en.html>
[POLICY] <https://github.com/Solo5/solo5/blob/main/AI.md>
[uniker.nl] <https://uniker.nl/>
Announcing segmap, a fast data structure for renamings
══════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-announcing-segmap-a-fast-data-structure-for-renamings/18626/1>
François Pottier announced
──────────────────────────
Hello! I am happy to announce `segmap'. This OCaml library implements
*segment maps*, a purely functional data structure that represents an
increasing function of the natural numbers into the natural
numbers. This data structure offers efficient support for many
operations, including lookup, reverse lookup, horizontal and vertical
displacements, insertion at the front end, composition, meet, and
join. This data structure may be useful in proof assistants,
compilers, and symbolic computation systems where variables are
encoded as de Bruijn indices or co-de Bruijn indices.
The data structure is described in [this paper], and [the
documentation of the library] is available online.
┌────
│ opam update
│ opam install segmap
└────
Happy hacking, FP.
[this paper]
<https://cambium.inria.fr/~fpottier/publis/fpottier-segmap.pdf>
[the documentation of the library]
<https://cambium.inria.fr/~fpottier/segmap/doc/segmap/Segmap/>
hexen.0.1
═════════
Archive: <https://discuss.ocaml.org/t/ann-hexen-0-1/18627/1>
Mikhail announced
─────────────────
Yo!
I needed to decode the hexadecimal substring, so I wrote [Hexen], yet
another library for encoding and decoding hexadecimal byte sequences.
The main goal of this library is to provide a flexible API for
encoding and decoding substrings into any destination (bytes or
buffers).
[Hexen] <https://github.com/dx3mod/hexen>
Usage
╌╌╌╌╌
Hexen provides high-level functions like `encode' and `decode' for
quick encoding and decoding of strings or substrings.
┌────
│ Hexen.encode "Hello World";;
│ (* - : string = "48656c6c6f20576f726c64" *)
│
│ Hexen.decode "48656c6c6f20576f726c64";;
│ (* - : string = "Hello World" *)
└────
┌────
│ Hexen.encode_substring "Hello World" 0 5;;
│ (* - : string = "48656c6c6f" *)
│
│ Hexen.decode_substring "48656c6c6f20576f726c64" 0 10;;
│ (* - : string = "Hello" *)
└────
Also, Hexen provides functions to encode and decode strings or
substrings directly into existing buffers or bytes.
┌────
│ let buffer = Buffer.create 16 in
│
│ Hexen.encode_to_buffer "Hello" buffer;
│ Hexen.encode_substring_to_buffer "Hello World" 5 6 buffer;
│
│ let bytes = Bytes.create 12 in
│ Hexen.decode_into (Buffer.contents buffer) 0 bytes 0 22;
│ Bytes.set bytes 11 '!';
│
│ bytes
│ (* - : bytes = Bytes.of_string "Hello World!" *)
└────
intel_hex.1.0
═════════════
Archive: <https://discuss.ocaml.org/t/ann-intel-hex-1-0/18628/1>
Mikhail announced
─────────────────
Yo!
I am happy to announce the first major release of the [Intel HEX
manipulation library].
Intel HEX format is commonly used to represent compiled program code
and data that is loaded into a microcontroller, flash memory, or ROM
in embedded systems programming.
And now you can work with it in pure OCaml!
[Intel HEX manipulation library] <https://github.com/dx3mod/intel_hex>
Changes
╌╌╌╌╌╌╌
• Redesign API;
• Added `Memory' module to process memory images of your firmwares;
• Instead of using the `ohex' package, we start use [hexen] for
encoding and decoding hexadecimals;
[hexen] <https://discuss.ocaml.org/t/ann-hexen-0-1/18627/1>
In use
╌╌╌╌╌╌
The library provides a simple API for parsing and creating Intel HEX
files. To create an Intel HEX file, you can use the following code:
┌────
│ Intel_hex.Record.
│ [
│ Extended_linear_address 0x0F;
│ Data (0x0000, "Hello ");
│ Data (0x0007, "World!");
│ End_of_file;
│ ]
│ |> Intel_hex.Object.to_string
│ |> print_endline
└────
┌────
│ :02000004000FEB
│ :0600000048656C6C6F20E6
│ :06000700576F726C6421CA
│ :00000001FF
└────
And to parse a string containing an Intel HEX file:
┌────
│ ":0600000048656C6C6F20E6\n:06000700576F726C6421CA"
│ |> Intel_hex.Object.of_string
│ (* - : Intel_hex.Object.t =
│ [ Intel_hex.Record.Data (0, "Hello ");
│ Intel_hex.Record.Data (7, "World!") ] *)
└────
However, the library also provides a module for working with memory
images built from Intel HEX files or other sources.
┌────
│ Intel_hex.Memory.of_string ~block_size:6 "Hello World!"
│ (* - : Intel_hex.Memory.t =
│ [ Intel_hex.Memory.Segment(0x0000, "Hello ");
│ Intel_hex.Memory.Segment(0x0006, "World!") ] *)
└────
For more details, see the [API reference].
[API reference] <https://ocaml.org/p/intel_hex/latest/doc/index.html>
Js_of_ocaml / Wasm_of_ocaml 6.5
═══════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-js-of-ocaml-wasm-of-ocaml-6-5/18632/1>
Hhugo announced
───────────────
I'm pleased to announce the joint release of js_of_ocaml and
wasm_of_ocaml 6.5.0, compilers from OCaml bytecode to JavaScript and
WebAssembly.
This release brings together more than 130 pull requests (about 400
commits) from 7 contributors since 6.4.0. Highlights:
• *OCaml 5.6* support.
• *OxCaml*: improved support.
• *Introcaml*: experimental support for [Introcaml] (OCaml values
shown in OCaml syntax in Chrome DevTools).
• *Faster compilation*: about 25–30% faster on large programs.
• *Smaller output*: binary constants are emitted as base64 and the
generated JavaScript is tighter (the toplevel example goes from
13.6 MB to 9.0 MB).
• *wasm_of_ocaml*: BLAKE2 and zstd (`Digest.BLAKE2*', compressed
marshaled values) no longer require multi-memory support, so they
work in Safari; plus faster runtime primitives and better
sourcemaps.
• *Effects*: better code with `--effects=cps' and
`--effects=double-translation'
• *New web API bindings*: WebGL2, Web Crypto, Service Workers,
Clipboard, Notification, FontFace, and more. The toplevel can run
in a Web Worker.
• Many bug fixes …
Breaking changes: `js_of_ocaml-lwt.logger' is removed (`lwt_log' is
deprecated), the `Typed_array.float{32,64}Array_fromArray' signatures
changed.
Contributors to this release: Vincent Balat, Frédéric Bour, Shon
Feder, habakan, Hugo Heuzard, Robin Ricard and Jérôme Vouillon. Thank
you all!
See the [documentation] and the [full changelog]. Please report any
issue on [GitHub].
It should soon be avaible on opam
(<https://github.com/ocaml/opam-repository/pull/30987>)
[Introcaml]
<https://discuss.ocaml.org/t/ann-introcaml-alpha-polymorphic-printing-and-introspection-for-ocaml/18407>
[documentation] <https://ocsigen.org/js_of_ocaml/>
[full changelog]
<https://github.com/ocsigen/js_of_ocaml/blob/master/CHANGES.md>
[GitHub] <https://github.com/ocsigen/js_of_ocaml/issues>
TIFF Inspector: an ocaml-tiff based inspector, with an in-browser OCaml playground
══════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/tiff-inspector-an-ocaml-tiff-based-inspector-with-an-in-browser-ocaml-playground/18634/1>
Ridwan Adebosin announced
─────────────────────────
Hi everyone,
I've been building *TIFF Inspector*, a tool for looking inside TIFF
files (directories, tags, storage layout, samples and planes), built
on [geocaml/ocaml-tiff].
• Live: <https://tiff-inspector.onrender.com/>
• Code: <https://github.com/RidwanAdebosin/tiff-inspect> (MIT)
It comes as a CLI, an HTTP API and a web UI. Every reported value says
where it came from: read from the file, a spec default, or
absent. Nothing is guessed.
[geocaml/ocaml-tiff] <https://github.com/geocaml/ocaml-tiff>
What might interest OCaml folks
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
*ocaml-tiff fixes.* Testing on unusual files turned up a few issues,
which I fixed in a vendored copy:
• BigTIFF entries with several small values stored inline (for example
BitsPerSample=[8,8,8], as GDAL writes them) were unreadable.
• Classic TIFF offsets of 2 GiB and above were sign-extended.
• SampleFormat stored at an offset rather than inline was not read.
• Entry introspection, so tools can see field types and counts.
*Independent test fixtures.* There are 21 small TIFFs generated by a
separate Python writer that shares no code with the parser, plus
golden outputs. They might be useful to ocaml-tiff as a conformance
set, if the maintainers want them.
*An in-browser playground.* At `/playground' you can write OCaml and
run it against ocaml-tiff and the inspector core on sample files, with
no install. It's the toplevel compiled with js_of_ocaml (about 1.3 MB
gzipped), running in a web worker. `;;' is optional, and compile
errors are underlined in the editor.
To get there I wrote JavaScript implementations of the C primitives
used by `bstr' and `checkseum'. I'd be glad to offer them upstream if
that's useful.
*The server.* It uses OCaml 5 with Eio and cohttp-eio. Each upload is
inspected in a separate process with time and memory limits, with rate
limiting and graceful shutdown. It runs in Docker on a free Render
instance.
Feedback welcome
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• Does the JSON report shape work for other geospatial tooling?
• geocaml maintainers: would you prefer the fixes as one PR or several
small ones?
• Any TIFFs that inspect wrongly. Issues with a sample file are gold.
Thanks for reading!
OCaml 5.5.2 released
════════════════════
Archive: <https://discuss.ocaml.org/t/ocaml-5-5-2-released/18638/1>
octachron announced
───────────────────
We have the pleasure of celebrating the anniversary of the first
powered flight in Europe by announcing the release of OCaml 5.5.2.
OCaml 5.5.2 fixes various minor security issues, two rare
miscompilations, a configuration issue with future versions of macOS,
and one runtime events library issue.
Overall, if you were already using any versions of OCaml 5.5, we are
advising you to switch to OCaml 5.5.2 .
The full list of bug fixes is available below for more details.
Happy hacking, – Florian Angeletti, for the OCaml team.
Installation Instructions
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
The base compiler can be installed as an opam switch with the
following commands:
┌────
│ opam update
│ opam switch create 5.5.2
└────
The source code for the release is also directly available on:
• GitHub: <https://github.com/ocaml/ocaml/archive/5.5.2.tar.gz>
• Inria archive:
<https://caml.inria.fr/pub/distrib/ocaml-5.5/ocaml-5.5.2.tar.gz>
Bug Fixes
╌╌╌╌╌╌╌╌╌
• [#15045]: Atomic loads whose results are unused should not be
removed during dead-code elimination. (Xavier Clerc, review by
Steven Dolan and KC Sivaramakrishnan)
• [#15067], [#15071]: Fix detection of functions available in the
future on macOS. (Antonin Décimo, review by Nicolás Ojeda Bär and
Damien Doligez)
• [#15112], OSEC-2026-22: `Unix.map_file': protect against overflow
when computing the data size. (Xavier Leroy and Nicolás Ojeda Bär,
review by Nicolás Ojeda Bär and Edwin Török)
• [#15113], OSEC-2026-21: `Str.string_partial_match': make sure
captured groups are valid. (Xavier Leroy, review by Nicolás Ojeda
Bär and Edwin Török)
• [#15115], OSEC-2026-23: Fix multiple issues in demarshaling
(`Marshal.from_{channel,string,bytes}') (Xavier Leroy, review by
Nicolás Ojeda Bär)
• [#15133], OSEC 2026-24: Multiple issues in command quoting on
Windows (Xavier Leroy and Nicolás Ojeda Bär, review by Nicolás Ojeda
Bär)
• [#15119], OSEC-2026-25: Harden decoding of runtime events messages
from ring buffers. (Sadiq Jaffer, report by Hannes Mehnert, review
by Olivier Nicole and Edwin Török)
• [#15177], OSEC-2026-26: Maintain custom events cache integrity.
(Sadiq Jaffer, report by Hannes Mehnert, review by Edwin Török)
• [#15043], [#15076]: runtime events library, fix an infinite loop
when a user event is larger than half the ring buffer. (Tim
McGilchrist, review by Sadiq Jaffer)
• [#15185], [#15187]: fix a pattern-matching miscompilation on certain
combinations of immediate ranges and redundant patterns (Gabriel
Scherer, report by Alperer Keleş, review by Vincent Laviron and
Florian Angeletti)
[#15045] <https://github.com/ocaml/ocaml/issues/15045>
[#15067] <https://github.com/ocaml/ocaml/issues/15067>
[#15071] <https://github.com/ocaml/ocaml/issues/15071>
[#15112] <https://github.com/ocaml/ocaml/issues/15112>
[#15113] <https://github.com/ocaml/ocaml/issues/15113>
[#15115] <https://github.com/ocaml/ocaml/issues/15115>
[#15133] <https://github.com/ocaml/ocaml/issues/15133>
[#15119] <https://github.com/ocaml/ocaml/issues/15119>
[#15177] <https://github.com/ocaml/ocaml/issues/15177>
[#15043] <https://github.com/ocaml/ocaml/issues/15043>
[#15076] <https://github.com/ocaml/ocaml/issues/15076>
[#15185] <https://github.com/ocaml/ocaml/issues/15185>
[#15187] <https://github.com/ocaml/ocaml/issues/15187>
bytream.0.4
═══════════
Archive: <https://discuss.ocaml.org/t/ann-bytream-0-4/18639/1>
Mikhail announced
─────────────────
Yo!
I am happy to announce the next version of the [Bytream] library,
which allows streaming bytes and processing them with low memory
allocation. This release includes many important updates.
[Bytream] <https://github.com/dx3mod/bytream>
Changes
╌╌╌╌╌╌╌
• Now, `Bytream' for slices uses the [Slice] library from the [Bstr]
project instead of its own `~buffer, ~offset, ~length' labeled
tuples, which require OCaml version 5.2 or higher;
┌────
│ let of_channel ?(io_buffer_size = 4096) ic =
│ let buffer = Bstr.create io_buffer_size in
│
│ let reader () =
│ match In_channel.input_bigarray ic buffer 0 io_buffer_size with
│ | 0 -> raise End_of_file
│ | len -> Slice_bstr.make ~len buffer
│ in
│
│ make reader
└────
• Added `bytream.ozstd' for Zstandard compression and decompression
via the [ozstd] library;
┌────
│ let output_compressed_string out_stream =
│ let out_stream = Bytream_ozstd.Out.make ~compression_level:3 out_stream in
│ Bytream.Out.output_string out_stream "Cras pulvinar sollicitudin nulla quis tempor.";
│ Bytream.Out.flush out_stream
│
│ let input_decompressed_line in_stream =
│ let in_stream = Bytream_ozstd.In.make in_stream in
│ Bytream.In.input_line in_stream
└────
• Added `bytream.bin' for declarative encoding and decoding bytes via
the [Bin] library;
┌────
│ type point = { x : int; y : int }
│
│ let point =
│ let open Bin in
│ record (fun x y -> { x; y })
│ |+ field neint16 (fun t -> t.x)
│ |+ field neint16 (fun t -> t.y)
│ |> sealr
│
│ let _ =
│ (* ... *)
│ let p = Bytream_bin.In.input in_stream point in
│ Bytream_bin.Out.output out_stream point { p with y = p.y * 2 }
└────
[Slice] <https://ocaml.org/p/slice/latest>
[Bstr] <https://ocaml.org/p/bstr/latest>
[ozstd] <https://github.com/dx3mod/ozstd>
[Bin] <https://ocaml.org/p/bin/latest>
Credits
╌╌╌╌╌╌╌
I would like to express my special gratitude to [Robur Coop] for their
libraries ([Bstr], [Slice], [Bin], etc.), which are very closely
integrated into my projects such as [Bytream], [ozstd] and
other. Thanks!
[Robur Coop] <https://robur.coop>
[Bstr] <https://ocaml.org/p/bstr/latest>
[Slice] <https://ocaml.org/p/slice/latest>
[Bin] <https://ocaml.org/p/bin/latest>
[Bytream] <https://github.com/dx3mod/bytream>
[ozstd] <https://github.com/dx3mod/ozstd>
First release of spvec
══════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-first-release-of-spvec/18641/1>
François Pottier announced
──────────────────────────
I am pleased to announce the first release of `spvec'. This small
OCaml library implements /semi-persistent vectors/. In other words, it
offers vectors that support just two operations, namely `push' and
`get', and that appear to be persistent (immutable), but must be used
according to a restricted discipline. Thanks to this restriction, an
efficient implementation, based on a mutable vector, is possible. One
might say that this library offers mutable vectors disguised as
persistent vectors, with a simple and safe API.
Two submodules are offered, `Spvec.Safe' and `Spvec.Unsafe'. The
/safe/ variant detects misuses of the library at runtime. The /unsafe/
variant is faster, but does not detect misuses; it should be used only
if and when the user's code is believed to be correct.
For more details, see the [documentation].
┌────
│ opam update
│ opam install spvec
└────
Happy hacking, FP.
[documentation] <https://cambium.inria.fr/~fpottier/spvec/doc/spvec/>
ocaml-emcc: compile OCaml programs with their C stubs to WebAssembly
════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-ocaml-emcc-compile-ocaml-programs-with-their-c-stubs-to-webassembly/18649/1>
rboud announced
───────────────
Hi everyone,
I've been working on a tool called ocaml-emcc, and it's now in a state
where other people could try it:
<https://github.com/rboudrouss/ocaml-emcc>
The idea is pretty simple. Instead of compiling OCaml to JS or wasm, I
compile `ocamlrun' with emscripten, compile all the C stubs of the
program and its dependencies with emcc, and link the whole thing into
one module. Nothing has to be rewritten in JavaScript. zarith,
sqlite3, camlzip, cryptokit, mirage-crypto, ctypes bindings and so on
"just" work, and so does your own C.
The obvious downside is that it's bytecode running in an interpreter,
so it's a lot slower than js_of_ocaml or wasm_of_ocaml. If your code
is pure OCaml or its C stubs already have JavaScript implementations,
use those instead. This is for the cases where the FFI part is the
problem.
Give it a shot!
┌────
│ opam pin add ocaml-emcc git+https://github.com/rboudrouss/ocaml-emcc.git
│ source /path/to/emsdk/emsdk_env.sh # emcc in PATH (you need to install emscripten)
│ ocaml-emcc build main.js # in your dune project
│ node main.js # or load main.js in a web page
└────
The extension of the output decides what you get (see the README and
emscripten's documentation for more flags):
• `main.js': node and browsers
• `main.html': the same, plus a minimal page
• `main.wasm': a standalone module, which still imports a few
emscripten functions
• `main.wasm --wasi': imports only WASI functions, so it runs on
wasmtime or node's WASI
It's still a prototype, so there are rough edges, if you try it on
something and it breaks, I'd really like to hear about it. Packages
that don't build are exactly what I'm looking for right now. Feel free
to propose/ask for new recipes too.
This started as an attempt to compile [MOPSA], a static analyzer
written in OCaml, to wasm. It turned out to be really hard because of
how much FFI it relies on (apron, gmp, clang's frontend…). I
eventually got it [working] by patching both OCaml and MOPSA's
sources, and gave a talk about it at the [OCaml Workshop 2026]. Since
then I've been turning that work into a general tool, and it turns out
to generalize quite well, so here it is.
I'm curious to hear what people would use it for, especially if you
have an OCaml project that never made it to the browser because of its
C dependencies.
[MOPSA] <https://gitlab.com/mopsa/mopsa-analyzer>
[working] <https://mopsawasm.rboud.com>
[OCaml Workshop 2026] <https://ocaml.org/ocaml-workshop-2026/schedule>
New release of snkv-ocaml 0.3.0 — OCaml bindings for SNKV with HNSW vector search
═════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-new-release-of-snkv-ocaml-0-3-0-ocaml-bindings-for-snkv-with-hnsw-vector-search/18650/1>
Tomasz Barański announced
─────────────────────────
Hi, everyone!
I’m happy to announce snkv-ocaml 0.3.0, OCaml bindings for SNKV, a
persistent, ACID key-value store built on SQLite’s B-tree engine. SNKV
provides key-value storage, column families, TTL, authenticated
encryption, transactions, iterators, and runtime statistics.
snkv-ocaml 0.3.0 is available in opam. This release corresponds to
upstream SNKV v0.8.2, and supports HNSW-based vector search over
vectors stored in the same database.
Links:
• Repository: <https://codeberg.org/tomaszb/snkv-ocaml>
• OPAM: <https://opam.ocaml.org/packages/snkv/>
• Changelog:
<https://codeberg.org/tomaszb/snkv-ocaml/src/branch/main/CHANGELOG.md>
• Upstream SNKV: <https://github.com/hash-anu/snkv>
Building TIFF Inspector: Exploring OCaml, TIFF Internals, and an In-Browser Playground
══════════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/building-tiff-inspector-exploring-ocaml-tiff-internals-and-an-in-browser-playground/18655/1>
RidwanAdebsoin announced
────────────────────────
Hi everyone!
I've been building *TIFF Inspector*, a tool for looking inside TIFF
files (directories, tags, storage layout, samples and planes), built
on [geocaml/ocaml-tiff].
• *Live:* [TIFF Inspector]
• *Code:* [GitHub repository] (MIT)
It comes as a CLI, an HTTP API and a web UI. Every reported value says
where it came from: read from the file, a spec default, or
absent. Nothing is guessed.
[geocaml/ocaml-tiff] <https://github.com/geocaml/ocaml-tiff>
[TIFF Inspector] <https://tiff-inspector.onrender.com/>
[GitHub repository] <https://github.com/RidwanAdebosin/tiff-inspect>
What might interest OCaml folks
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
*ocaml-tiff fixes.* Testing on unusual files turned up a few issues,
which I fixed in a vendored copy:
• BigTIFF entries with several small values stored inline (for
example, `BitsPerSample=[8,8,8]', as GDAL writes them) were
unreadable.
• Classic TIFF offsets of 2 GiB and above were sign-extended.
• `SampleFormat' stored at an offset rather than inline was not read.
• Entry introspection, so tools can see field types and counts.
*Independent test fixtures.* There are 21 small TIFFs generated by a
separate Python writer that shares no code with the parser, plus
golden outputs. They might be useful to `ocaml-tiff' as a conformance
set, if the maintainers want them.
*An in-browser playground.* At `/playground', you can write OCaml and
run it against `ocaml-tiff' and the inspector core on sample files,
with no install. It's the toplevel compiled with `js_of_ocaml' (about
1.3 MB gzipped), running in a web worker. `;;' is optional, and
compile errors are underlined in the editor.
To get there, I wrote JavaScript implementations of the C primitives
used by `bstr' and `checkseum'. I'd be glad to offer them upstream if
that's useful.
*The server.* It uses OCaml 5 with Eio and cohttp-eio. Each upload is
inspected in a separate process with time and memory limits, with
rate limiting and graceful shutdown. It runs in Docker on a free
Render instance.
Feedback welcome
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• Does the JSON report shape work for other geospatial tooling?
• `geocaml' maintainers: would you prefer the fixes as one PR or
several small ones?
• Any TIFFs that inspect incorrectly? Issues with a sample file are
gold.
Thanks for reading!
stele 0.1.0: syntax-error messages for Menhir grammars
══════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-stele-0-1-0-syntax-error-messages-for-menhir-grammars/18657/1>
Jérôme Vouillon announced
─────────────────────────
I'm happy to announce the first release of [stele], a tool that writes
the syntax-error messages of a Menhir grammar for you.
A Menhir parser that meets bad input raises `Error', which says where
the parse failed but not why. Menhir can show a real message instead,
but only if you write one for every error state (every point where the
parse can get stuck). A realistic grammar has hundreds of them, and
they go stale as the grammar changes.
stele generates them at build time, from `menhir --list-errors' and
the grammar's `.cmly'. With a few aliases and one `%on_error_reduce'
annotation, the calculator from the tutorial reports:
┌────
│ Error: Assuming that the statements are complete, expecting '}'.
│ --> stray.calc:1:6
│ 1 | { 1; ) }
│ · ^
│ · ^^ these statements
│ · ^ This '{' opens the enclosing construct.
└────
What you get:
• *A message for every error state*, saying what could come next. Each
list is checked against the parser's tables, so a message never
offers a token the parser would reject in that state.
• *Location hints*: the opening delimiter the input is still inside,
and the construct the parser assumed complete. A small runtime
library, `stele.runtime', turns these into source spans when the
parser fails. It depends only on `menhirLib', so it works under
js_of_ocaml and wasm_of_ocaml. stele leaves the rendering to you;
[Grace] works well.
• *Better wording when you want it*: a small config file gives
readable names and groups tokens ("an operator"), and an overrides
file holds hand-written messages for the few states that need
one. Stale entries in either fail the build.
stele builds on François Pottier's [/Reachability and Error Diagnosis
in LR(1) Parsers/] (CC 2016), the paper behind `--list-errors'. It
automates the work the paper did by hand for CompCert's parser. It
started inside the [Wax] toolchain, where it produces the error
messages of both its grammars.
To try it:
┌────
│ opam install stele
└────
It needs OCaml ≥ 4.14 and menhir ≥ 20260122. The [tutorial] takes a
small calculator grammar from "Syntax error" to the full setup in ten
stages. Its final state is a runnable example to copy.
[stele] <https://github.com/vouillon/stele>
[Grace] <https://github.com/johnyob/grace>
[/Reachability and Error Diagnosis in LR(1) Parsers/]
<https://dl.acm.org/doi/10.1145/2892208.2892224>
[Wax] <https://github.com/ocsigen/wax>
[tutorial] <https://github.com/vouillon/stele/blob/main/TUTORIAL.md>
OSEC-2026-21: Str partial-match stale capture registers underflow
═════════════════════════════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-21
│ modified: "2026-10-26T15:15:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity:
│ "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N/E:P/AU:Y/R:U"
│ severity_score: "5.5 (Medium)"
│ affected: "ocaml" {< "5.5.2"}
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "824dadcbde77aea27d84b8d70a72442b8fcb344a"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "feccd4744ebe25b90208e569d03efd514b964dce"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Nicolás Ojeda Bär"]
│ [remediation_reviewer "Edwin Török"]
│ [remediation_developer "Xavier Leroy"]
│ ]
│ cwe: [ CWE-122 ]
│ affected_bindings: ["Str.string_partial_match" "Str.replace_matched"
│ "Str.global_replace" "Str.replace_first" ]
└────
*Str partial-match stale capture registers underflow*
ANT-2026-KKC4QS4S Str partial-match stale capture registers underflow
`Str.string_partial_match' records the beginning and end of a captured
group. There was an implicit assumption that `beginning <= end'.
However if it reached the end of the matched string but not the end of
the regexp, it was possible for the beginning of the group to be
matched at iteration N of the star operator, and the end of the group
to be matched at iteration N-1, resulting in `beginning > end'.
`Str.matched_group' is safe, it fails with an `Invalid_argument' on
groups with `beginning > end', but `Str.replace_matched' can crash,
trying to memcpy `end - beginning' bytes.
The example in the ANT is `ab' partially matched against
`\(\(a\)b\)+'. Group 2 has `beginning = 2' and `end = 1'.
Fix
╌╌╌
The fix is to record groups with `beginning > end' as not matched.
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
All of the following conditions are necessary:
‣ you need to use `Str.string_partial_match'
‣ if you don't use this function you are not affected
‣ you need to use one of
`Str.{replace_matched,global_replace,replace_first}' on the same
regexp after a call to `Str.string_partial_match'.
‣ If you use `Str.group_beginning' and `Str.group_end' and do your
own string manipulation that is safe, because the String module
would raise on out of bounds accesses. Similarly
`Str.matched_group' is safe (uses `String' functions in its OCaml
implementation)
‣ the match replacement must reference a group > 0
‣ if the replacement string argument is fixed, and doesn't reference
any groups, or references only group 0, then you are not affected
‣ the referenced replacement group must be under a repetition operator
in the original regexp
‣ if there is no repetition operator in the regexp, or there are no
groups under the repetition operator then you are not affected
For example `{|\(\(a\)b\)+|}' as the regular expression in a call to
`Str.string_partial_match', followed by a reference to `\2' in the
argument of `Str.replace_matched' could be affected.
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2026-09-29: fix merged to trunk
OSEC-2026-22: Integer overflow in Unix.map_file
═══════════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-22
│ modified: "2026-10-23T22:30:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity:
│ "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:H/SC:N/SI:N/SA:N/E:P"
│ severity_score: "5.5 (Medium)"
│ affected: "ocaml" {< "5.5.2"}
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "de57bb4f59c3302260aaeaaa4dfee12695597d25"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "ff978d2139ba638886c2565f2d86c0ee265840a5"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Nicolás Ojeda Bär"]
│ [remediation_reviewer "Edwin Török"]
│ [remediation_developer "Xavier Leroy"]
│ ]
│ cwe: [ CWE-190 ]
│ affected_bindings: ["Unix.map_file"]
└────
*Integer overflow in Unix.map_file*
ANT-2026-6W9NPC2Q mmap dimension product integer overflow
Fix
╌╌╌
Use `caml_umul_overflow' instead of `*' when multiplying bigarray
dimensions, which detects integer overflows and raise `Failure'.
Negative positions are also rejected by raising `Invalid_argument'.
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If either the dimensions or the file size in a call to `Unix.map_file'
from your code is user controllable then you are potentially affected.
Score notes
╌╌╌╌╌╌╌╌╌╌╌
The vulnerability is in a library, and the CVSS score is calculated
[under worst case assumptions]. For an actual application the score
will depend on how much an attacker can control the input to this
function (if at all).
[under worst case assumptions]
<https://www.first.org/cvss/v4.0/user-guide#Assessing-Vulnerabilities-in-Software-Libraries-and-Similar>
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2026-09-29: fix merged to trunk
OSEC-2026-23: Multiple issues in Marshal
════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-23
│ modified: "2026-10-23T22:30:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity: "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N"
│ severity_score: "6.8"
│ affected: "ocaml" {< "5.5.2"}
│ aliases: [ CVE-2026-28364 ]
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "7da997d28b1ac57dd3a7108a865b327493fd4239"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "709b0ab93e53d54297b42d897d74dced1e9c75a5"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Nicolás Ojeda Bär"]
│ [remediation_developer "Xavier Leroy"]
│ ]
│ cwe: [ CWE-126 CWE-502 CWE-754]
│ affected_bindings: ["Marshal.from_channel" "Marshal.from_bytes"
│ "Marshal.from_string" "input_value" ]
└────
*Multiple issues in Marshal*
Several issues have been discovered in the Marshal module:
ANT-2026-K7NTK0FT Stale obj_counter across unmarshal calls enables
null/freed intern_obj_table indexing
ANT-2026-2NJYQWEX Custom block size wraparound in CODE_CUSTOM_LEN
allocation
ANT-2026-PJC00M7X Unmarshaler accepts forged Closure_tag metadata
without validation
This is a followup for [OSEC-2026-01]
Corrupted or malicious marshaled data that causes undefined behaviour
in the runtime system when unmarshaled. input_value should either fail
cleanly or produce a well-formed OCaml object, without corrupting the
runtime system.
Consequently, this excludes well-formed marshaled data that produces
an OCaml object that is not of the type expected by the OCaml code and
causes the Ocaml code to crash or misbehave.
[OSEC-2026-01] <https://osv.dev/vulnerability/OSEC-2026-01>
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If you use one of the affected bindings `Marshal.from_channel',
`Marshal.from_bytes', `Marshal.from_string', `Stdlib.input_value' (or
a wrapper in a library, such as `Lwt_io.read_value').
Please note that Marshal is not type safe, and you have to be careful
if you use the deserialization on untrusted input (due to type
confusion, and remote code execution by design - you can use Marshal
for code).
It is recommended to use Marshal only for communication between
trusted processes.
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2026-09-29: fix merged to trunk
OSEC-2026-24: Multiple issues in command quoting on Windows
═══════════════════════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-24
│ modified: "2026-10-23T22:30:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity:
│ "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P"
│ severity_score: "7.3 (High)"
│ aliases : [ CVE-2026-41083 ]
│ affected: "ocaml" {< "5.5.2"}
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "70a3a75c0bfb23d67ad5fe3e9c1ba9800d61feae"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "0bbf8e5af985feb03a11a5ffe57d068373d09fd0"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Nicolás Ojeda Bär"]
│ [remediation_developer "Xavier Leroy"]
│ ]
│ cwe: [ CWE-78 ]
│ affected_bindings: ["Filename.quote_command" "Unix.create_process"
│ "Unix.create_process_env" "Unix.open_process_args_in"
│ "Unix.open_process_args_out" "Unix.open_process_args_full"]
└────
*Multiple issues in command quoting on Windows*
ANT-2026-R7FKP7RG Win32 quote_cmd_filename misses pipe/redirect
metacharacters
ANT-2026-SRZZ62SD Windows batch-file argument injection via
maybe_quote/make_cmdline
ANT-2026-JPEWMPAB Win32 argument quoting leaves embedded CR/LF
unescaped
Also includes the fix for [OSEC-2026-05]
`Filename.quote_command' returns a quoted command line, suitable for
use as an argument to `Sys.command', `Unix.system', and the
`Unix.open_process' functions. However on Windows certain characters
weren't properly escaped.
`Unix.create_process' can invoke `.bat' or `.cmd' programs on Windows,
and certain characters were accepted that cannot be quoted safely.
[OSEC-2026-05] <https://osv.dev/vulnerability/OSEC-2026-05>
Fix
╌╌╌
`Filename.quote_command' has been updated to correctly quote
arguments. `Unix.create_process*' has been updated to reject
arguments that cannot be safely quoted by raising `Failure':
if the program [prog] is a [.bat] or [.cmd] script and
either [prog] or [args] contain characters that cannot be
securely passed to a script, such as [" | & , ; < = > ^ %
"]. If you really need to pass these characters to a
script, consider using {!Unix.system} instead.
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If you use `Filename.quote_command' on Windows with user supplied
arguments. If you use `Unix.create_process*' or `Unix.open_process*'
on Windows with `.bat' or `.cmd' programs, and user supplied
arguments.
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2029-09-05: fix merged to trunk
OSEC-2026-25: Heap buffer overflow in the OCaml `runtime_events' consumer when parsing an oversized custom user event
═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-25
│ modified: "2026-10-23T22:30:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity:
│ "CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P"
│ severity_score: "4.5 (Medium)"
│ affected: "ocaml" {< "5.5.2"}
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "2247294d06464df0273479f41b0418655918da27"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "9dcf0c86201cf5e8ece56c6bb5f61fc4d92fb74a"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Olivier Nicole"]
│ [remediation_reviewer "Edwin Török"]
│ [remediation_developer "Sadiq Jaffer"]
│ ]
│ cwe: [ CWE-20 CWE-122 ]
│ affected_bindings: ["Runtime_events.read_poll" ]
└────
*Heap buffer overflow in the OCaml `runtime_events' consumer when
parsing an oversized custom user event*
ANT-2026-0JXJVEVY
Custom events maintains a cache of user events, it is possible to have
a corrupt stream that has a valid message with one message type (which
can be custom/unit/span/int) and then has the same event with a
different message type.
This would never be encountered in a real program but can lead to a
crash.
Fix
╌╌╌
Check message lengths for all runtime event types, report a corrupt
stream on mismatch.
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If the runtime events producer and consumer run in separate processes,
and the producer can be tricked into producing malformed data.
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2027-09-05: fix merged to trunk
OSEC-2026-26: runtime_events user event name-based type confusion
═════════════════════════════════════════════════════════════════
Hannes Mehnert announced
────────────────────────
Dear everyone,
a new advisory was published for the OCaml runtime. Below is the
advisory, you can as well find it at
<https://github.com/ocaml/security-advisories> and
<https://osv.dev/list?q=&ecosystem=opam>
Best,
Hannes
┌────
│ id: OSEC-2026-26
│ modified: "2026-10-23T22:30:00+01:00"
│ published: "2026-10-23T22:30:00+01:00"
│ severity:
│ "CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P"
│ severity_score: "4.5 (Medium)"
│ affected: "ocaml" {< "5.5.2"}
│ events: [
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "ac2fae847a9c2c35ae3bba90a19adbe5d0cc6f59"]
│ ]
│ ]
│ [
│ git "https://github.com/ocaml/ocaml" [
│ [fixed "de10a6b03a471821cb0b868223e5331b919f48c0"]
│ ]
│ ]
│ ]
│ credits: [
│ [reporter "Anthropic"]
│ [coordinator "Hannes Mehnert"]
│ [coordinator "Edwin Török"]
│ [remediation_reviewer "Edwin Török"]
│ [remediation_developer "Sadiq Jaffer"]
│ ]
│ cwe: [ CWE-20 CWE-122 ]
│ affected_bindings: ["Runtime_events.read_poll"]
└────
*runtime_events user event name-based type confusion*
ANT-2026-DTBY2HWS
Custom events maintains a cache of user events, it is possible to have
a corrupt stream that has a valid message with one message type (which
can be custom/unit/span/int) and then has the same event with a
different message type.
This would never be encountered in a real program but can lead to a
crash.
Fix
╌╌╌
Validate event type against expected type, report a corrupt stream on
mismatch.
Am I affected?
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If the runtime events producer and consumer run in separate processes,
and the producer can be tricked into producing malformed data.
Timeline
╌╌╌╌╌╌╌╌
• 2026-08-24: vulnerability was found
• 2026-08-27: forwarded report to security@ocaml.org
• 2027-10-20: fix merged to trunk
Old CWN
═══════
If you happen to miss a CWN, you can [send me a message] and I'll mail
it to you, or go take a look at [the archive] or the [RSS feed of the
archives].
If you also wish to receive it every week by mail, you may subscribe
to the [caml-list].
[Alan Schmitt]
[send me a message] <mailto:alan.schmitt@polytechnique.org>
[the archive] <https://alan.petitepomme.net/cwn/>
[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>
[caml-list] <https://sympa.inria.fr/sympa/info/caml-list>
[Alan Schmitt] <https://alan.petitepomme.net/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 568 bytes --]
next reply other threads:[~2026-10-27 10:29 UTC|newest]
Thread overview: 316+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-27 10:29 Alan Schmitt [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-10-20 8:16 alan.schmitt
2026-10-13 6:57 Alan Schmitt
2026-10-06 13:15 Alan Schmitt
2026-09-29 7:10 Alan Schmitt
2026-09-22 7:41 Alan Schmitt
2026-09-15 8:08 Alan Schmitt
2026-09-08 13:20 Alan Schmitt
2026-09-01 9:14 Alan Schmitt
2026-08-25 7:36 Alan Schmitt
2026-08-18 6:56 Alan Schmitt
2026-08-11 12:25 Alan Schmitt
2026-08-04 7:44 Alan Schmitt
2026-07-28 12:44 Alan Schmitt
2026-07-21 16:02 Alan Schmitt
2026-07-14 7:16 Alan Schmitt
2026-07-07 13:29 Alan Schmitt
2026-06-30 13:25 Alan Schmitt
2026-06-23 10:07 Alan Schmitt
2026-06-16 10:51 Alan Schmitt
2026-06-09 7:39 Alan Schmitt
2026-06-02 9:01 Alan Schmitt
2026-05-26 7:36 Alan Schmitt
2026-05-19 8:52 Alan Schmitt
2026-05-12 7:28 Alan Schmitt
2026-05-05 9:35 Alan Schmitt
2026-04-28 7:59 Alan Schmitt
2026-04-21 9:34 Alan Schmitt
2026-04-14 9:50 Alan Schmitt
2026-04-07 9:32 Alan Schmitt
2026-03-31 6:10 Alan Schmitt
2026-03-24 9:58 Alan Schmitt
2026-03-17 14:39 Alan Schmitt
2026-03-10 13:30 Alan Schmitt
2026-03-03 13:54 Alan Schmitt
2026-02-24 13:36 Alan Schmitt
2026-02-17 13:47 Alan Schmitt
2026-02-10 10:36 Alan Schmitt
2026-02-03 10:04 Alan Schmitt
2026-01-27 12:41 Alan Schmitt
2026-01-20 9:19 Alan Schmitt
2026-01-13 8:27 Alan Schmitt
2026-01-06 13:14 Alan Schmitt
2025-12-30 9:33 Alan Schmitt
2025-12-23 11:00 Alan Schmitt
2025-12-16 13:30 Alan Schmitt
2025-12-09 15:04 Alan Schmitt
2025-12-02 10:39 Alan Schmitt
2025-11-25 13:49 Alan Schmitt
2025-11-18 14:01 Alan Schmitt
2025-11-11 9:49 Alan Schmitt
2025-11-04 13:21 Alan Schmitt
2025-10-28 13:30 Alan Schmitt
2025-10-21 9:17 Alan Schmitt
2025-10-14 9:56 Alan Schmitt
2025-10-07 12:22 Alan Schmitt
2025-09-30 13:12 Alan Schmitt
2025-09-23 13:23 Alan Schmitt
2025-09-16 11:52 Alan Schmitt
2025-09-09 12:30 Alan Schmitt
2025-09-02 12:23 Alan Schmitt
2025-08-26 12:34 Alan Schmitt
2025-08-19 12:20 Alan Schmitt
2025-08-12 15:32 Alan Schmitt
2025-08-05 8:17 Alan Schmitt
2025-07-29 9:36 Alan Schmitt
2025-07-22 12:07 Alan Schmitt
2025-07-15 17:14 Alan Schmitt
2025-07-08 12:45 Alan Schmitt
2025-07-01 11:16 Alan Schmitt
2025-06-24 14:02 Alan Schmitt
2025-06-17 6:44 Alan Schmitt
2025-06-10 13:36 Alan Schmitt
2025-06-03 9:19 Alan Schmitt
2025-05-27 9:22 Alan Schmitt
2025-05-20 11:52 Alan Schmitt
2025-05-13 9:40 Alan Schmitt
2025-05-06 7:24 Alan Schmitt
2025-04-29 8:39 Alan Schmitt
2025-04-22 11:50 Alan Schmitt
2025-04-15 9:51 Alan Schmitt
2025-04-08 13:14 Alan Schmitt
2025-04-01 9:12 Alan Schmitt
2025-03-25 8:06 Alan Schmitt
2025-03-18 10:18 Alan Schmitt
2025-03-11 15:00 Alan Schmitt
2025-03-04 14:01 Alan Schmitt
2025-02-25 10:36 Alan Schmitt
2025-02-18 14:33 Alan Schmitt
2025-02-11 7:17 Alan Schmitt
2025-02-04 12:05 Alan Schmitt
2025-01-28 13:24 Alan Schmitt
2025-01-21 15:47 Alan Schmitt
2025-01-14 8:20 Alan Schmitt
2025-01-07 17:26 Alan Schmitt
2024-12-31 8:03 Alan Schmitt
2024-12-24 8:55 Alan Schmitt
2024-12-17 13:05 Alan Schmitt
2024-12-10 13:48 Alan Schmitt
2024-12-03 14:44 Alan Schmitt
2024-11-26 8:30 Alan Schmitt
2024-11-19 6:52 Alan Schmitt
2024-11-12 15:00 Alan Schmitt
2024-11-05 13:22 Alan Schmitt
2024-10-29 13:30 Alan Schmitt
2024-10-22 12:42 Alan Schmitt
2024-10-15 13:31 Alan Schmitt
2024-10-08 10:56 Alan Schmitt
2024-10-01 13:37 Alan Schmitt
2024-09-24 13:18 Alan Schmitt
2024-09-17 14:02 Alan Schmitt
2024-09-10 13:55 Alan Schmitt
2024-09-03 8:24 Alan Schmitt
2024-08-27 9:02 Alan Schmitt
2024-08-20 9:29 Alan Schmitt
2024-08-13 13:21 Alan Schmitt
2024-08-06 9:00 Alan Schmitt
2024-07-30 13:26 Alan Schmitt
2024-07-23 13:30 Alan Schmitt
2024-07-16 6:24 Alan Schmitt
2024-07-09 9:19 Alan Schmitt
2024-07-02 7:30 Alan Schmitt
2024-06-25 13:58 Alan Schmitt
2024-06-18 13:05 Alan Schmitt
2024-06-11 15:04 Alan Schmitt
2024-06-04 13:26 Alan Schmitt
2024-05-28 9:07 Alan Schmitt
2024-05-21 13:07 Alan Schmitt
2024-05-14 13:25 Alan Schmitt
2024-05-07 7:30 Alan Schmitt
2024-04-30 7:22 Alan Schmitt
2024-04-23 12:17 Alan Schmitt
2024-04-16 12:00 Alan Schmitt
2024-04-09 9:15 Alan Schmitt
2024-04-02 14:31 Alan Schmitt
2024-03-26 6:32 Alan Schmitt
2024-03-19 15:09 Alan Schmitt
2024-03-12 10:31 Alan Schmitt
2024-03-05 14:50 Alan Schmitt
2024-02-27 13:53 Alan Schmitt
2024-02-20 9:12 Alan Schmitt
2024-02-13 8:42 Alan Schmitt
2024-02-06 15:14 Alan Schmitt
2024-01-30 14:16 Alan Schmitt
2024-01-23 9:45 Alan Schmitt
2024-01-16 10:01 Alan Schmitt
2024-01-09 13:40 Alan Schmitt
2024-01-02 8:59 Alan Schmitt
2023-12-26 10:12 Alan Schmitt
2023-12-19 10:10 Alan Schmitt
2023-12-12 10:20 Alan Schmitt
2023-12-05 10:13 Alan Schmitt
2023-11-28 9:09 Alan Schmitt
2023-11-21 7:47 Alan Schmitt
2023-11-14 13:42 Alan Schmitt
2023-11-07 10:31 Alan Schmitt
2023-10-31 10:43 Alan Schmitt
2023-10-24 9:17 Alan Schmitt
2023-10-17 7:46 Alan Schmitt
2023-10-10 7:48 Alan Schmitt
2023-10-03 13:00 Alan Schmitt
2023-09-19 8:54 Alan Schmitt
2023-09-12 13:21 Alan Schmitt
2023-09-05 9:00 Alan Schmitt
2023-08-29 13:04 Alan Schmitt
2023-08-22 9:20 Alan Schmitt
2023-08-15 16:33 Alan Schmitt
2023-08-08 8:53 Alan Schmitt
2023-08-01 7:13 Alan Schmitt
2023-07-25 8:45 Alan Schmitt
2023-07-11 8:45 Alan Schmitt
2023-07-04 9:18 Alan Schmitt
2023-06-27 8:38 Alan Schmitt
2023-06-20 9:52 Alan Schmitt
2023-06-13 7:09 Alan Schmitt
2023-06-06 14:22 Alan Schmitt
2023-05-30 15:43 Alan Schmitt
2023-05-23 9:41 Alan Schmitt
2023-05-16 13:05 Alan Schmitt
2023-05-09 11:49 Alan Schmitt
2023-05-02 8:01 Alan Schmitt
2023-04-25 9:25 Alan Schmitt
2023-04-18 8:50 Alan Schmitt
2023-04-11 12:41 Alan Schmitt
2023-04-04 8:45 Alan Schmitt
2023-03-28 7:21 Alan Schmitt
2023-03-21 10:07 Alan Schmitt
2023-03-14 9:52 Alan Schmitt
2023-03-07 9:02 Alan Schmitt
2023-02-28 14:38 Alan Schmitt
2023-02-21 10:19 Alan Schmitt
2023-02-14 8:12 Alan Schmitt
2023-02-07 8:16 Alan Schmitt
2023-01-31 6:44 Alan Schmitt
2023-01-24 8:57 Alan Schmitt
2023-01-17 8:37 Alan Schmitt
2022-11-29 14:53 Alan Schmitt
2022-09-27 7:17 Alan Schmitt
2022-09-20 14:01 Alan Schmitt
2022-09-13 8:40 Alan Schmitt
2022-08-23 8:06 Alan Schmitt
2022-08-16 8:51 Alan Schmitt
2022-08-09 8:02 Alan Schmitt
2022-08-02 9:51 Alan Schmitt
2022-07-26 17:54 Alan Schmitt
2022-07-19 8:58 Alan Schmitt
2022-07-12 7:59 Alan Schmitt
2022-07-05 7:42 Alan Schmitt
2022-06-28 7:37 Alan Schmitt
2022-06-21 8:06 Alan Schmitt
2022-06-14 9:29 Alan Schmitt
2022-06-07 10:15 Alan Schmitt
2022-05-31 12:29 Alan Schmitt
2022-05-24 8:04 Alan Schmitt
2022-05-17 7:12 Alan Schmitt
2022-05-10 12:30 Alan Schmitt
2022-05-03 9:11 Alan Schmitt
2022-04-26 6:44 Alan Schmitt
2022-04-19 5:34 Alan Schmitt
2022-04-12 8:10 Alan Schmitt
2022-04-05 11:50 Alan Schmitt
2022-03-29 7:42 Alan Schmitt
2022-03-22 13:01 Alan Schmitt
2022-03-15 9:59 Alan Schmitt
2022-03-01 13:54 Alan Schmitt
2022-02-22 12:43 Alan Schmitt
2022-02-08 13:16 Alan Schmitt
2022-02-01 13:00 Alan Schmitt
2022-01-25 12:44 Alan Schmitt
2022-01-11 8:20 Alan Schmitt
2022-01-04 7:56 Alan Schmitt
2021-12-28 8:59 Alan Schmitt
2021-12-21 9:11 Alan Schmitt
2021-12-14 11:02 Alan Schmitt
2021-11-30 10:51 Alan Schmitt
2021-11-16 8:41 Alan Schmitt
2021-11-09 10:08 Alan Schmitt
2021-11-02 8:50 Alan Schmitt
2021-10-19 8:23 Alan Schmitt
2021-09-28 6:37 Alan Schmitt
2021-09-21 9:09 Alan Schmitt
2021-09-07 13:23 Alan Schmitt
2021-08-24 13:44 Alan Schmitt
2021-08-17 6:24 Alan Schmitt
2021-08-10 16:47 Alan Schmitt
2021-07-27 8:54 Alan Schmitt
2021-07-20 12:58 Alan Schmitt
2021-07-06 12:33 Alan Schmitt
2021-06-29 12:24 Alan Schmitt
2021-06-22 9:04 Alan Schmitt
2021-06-01 9:23 Alan Schmitt
2021-05-25 7:30 Alan Schmitt
2021-05-11 14:47 Alan Schmitt
2021-05-04 8:57 Alan Schmitt
2021-04-27 14:26 Alan Schmitt
2021-04-20 9:07 Alan Schmitt
2021-04-06 9:42 Alan Schmitt
2021-03-30 14:55 Alan Schmitt
2021-03-23 9:05 Alan Schmitt
2021-03-16 10:31 Alan Schmitt
2021-03-09 10:58 Alan Schmitt
2021-02-23 9:51 Alan Schmitt
2021-02-16 13:53 Alan Schmitt
2021-02-02 13:56 Alan Schmitt
2021-01-26 13:25 Alan Schmitt
2021-01-19 14:28 Alan Schmitt
2021-01-12 9:47 Alan Schmitt
2021-01-05 11:22 Alan Schmitt
2020-12-29 9:59 Alan Schmitt
2020-12-22 8:48 Alan Schmitt
2020-12-15 9:51 Alan Schmitt
2020-12-01 8:54 Alan Schmitt
2020-11-03 15:15 Alan Schmitt
2020-10-27 8:43 Alan Schmitt
2020-10-20 8:15 Alan Schmitt
2020-10-06 7:22 Alan Schmitt
2020-09-29 7:02 Alan Schmitt
2020-09-22 7:27 Alan Schmitt
2020-09-08 13:11 Alan Schmitt
2020-09-01 7:55 Alan Schmitt
2020-08-18 7:25 Alan Schmitt
2020-07-28 16:57 Alan Schmitt
2020-07-21 14:42 Alan Schmitt
2020-07-14 9:54 Alan Schmitt
2020-07-07 10:04 Alan Schmitt
2020-06-30 7:00 Alan Schmitt
2020-06-16 8:36 Alan Schmitt
2020-06-09 8:28 Alan Schmitt
2020-05-19 9:52 Alan Schmitt
2020-05-12 7:45 Alan Schmitt
2020-05-05 7:45 Alan Schmitt
2020-04-28 12:44 Alan Schmitt
2020-04-21 8:58 Alan Schmitt
2020-04-14 7:28 Alan Schmitt
2020-04-07 7:51 Alan Schmitt
2020-03-31 9:54 Alan Schmitt
2020-03-24 9:31 Alan Schmitt
2020-03-17 11:04 Alan Schmitt
2020-03-10 14:28 Alan Schmitt
2020-03-03 8:00 Alan Schmitt
2020-02-25 8:51 Alan Schmitt
2020-02-18 8:18 Alan Schmitt
2020-02-04 8:47 Alan Schmitt
2020-01-28 10:53 Alan Schmitt
2020-01-21 14:08 Alan Schmitt
2020-01-14 14:16 Alan Schmitt
2020-01-07 13:43 Alan Schmitt
2019-12-31 9:18 Alan Schmitt
2019-12-17 8:52 Alan Schmitt
2019-12-10 8:21 Alan Schmitt
2019-12-03 15:42 Alan Schmitt
2019-11-26 8:33 Alan Schmitt
2019-11-12 13:21 Alan Schmitt
2019-11-05 6:55 Alan Schmitt
2019-10-15 7:28 Alan Schmitt
2019-09-03 7:35 Alan Schmitt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2y0bjjv2a.fsf@mac-03220211.irisa.fr \
--to=alan.schmitt@polytechnique.org \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox