Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dune corrupts ~10400 bytes of binary during artifact version substitution causing segfault #6668

Closed
edwintorok opened this issue Dec 9, 2022 · 11 comments · Fixed by #6669
Closed
Milestone

Comments

@edwintorok
Copy link
Contributor

edwintorok commented Dec 9, 2022

Expected Behavior

No segfault

Actual Behavior

Segfault, and a hex comparison of before/after artifact substitution shows it has changed ~10400 bytes after the end of the placeholder:

./repro.sh
0.0.0
0.0.0
Fatal error: exception Failure("Couldn't determine xapi version - got unexpected version from dune: 'fbe3031'")
Found placeholder in _build/default/gen_lifecycle.bc:
- placeholder: Vcs_describe "."
- evaluates to: "fbe3031"
Found placeholder in _build/default/gen_lifecycle.bc:
- placeholder: Vcs_describe "."
- evaluates to: "fbe3031"
Found placeholder in _build/default/gen_lifecycle.exe:
- placeholder: Vcs_describe "."
- evaluates to: "fbe3031"
Segmentation fault (core dumped)
$ xxd _build/default/gen_lifecycle.exe >good
$ xxd gen_lifecycle.exe >bad
$ diff -wu good bad
--- good        2022-12-09 17:23:07.590138110 +0000
+++ bad 2022-12-09 17:23:01.857971513 +0000
@@ -48493,663 +48493,663 @@
 000bd6c0: fc07 0000 0000 0000 332e 322e 3000 0002  ........3.2.0...
 000bd6d0: fc0b 0000 0000 0000 6475 6e65 2d62 7569  ........dune-bui
 000bd6e0: 6c64 2d69 6e66 6f00 fc27 0000 0000 0000  ld-info..'......
-000bd6f0: 2525 4455 4e45 5f50 4c41 4345 484f 4c44  %%DUNE_PLACEHOLD
-000bd700: 4552 3a36 343a 7663 732d 6465 7363 7269  ER:64:vcs-descri
-000bd710: 6265 3a31 3a2e 2525 2525 2525 2525 2525  be:1:.%%%%%%%%%%
-000bd720: 2525 2525 2525 2525 2525 2525 2525 2525  %%%%%%%%%%%%%%%%
-000bd730: 0000 0000 0000 0007 0000 0000 0000 0000  ................
-000bd740: 0000 0000 0000 0000 0700 0000 0000 0000  ................
-000bd750: f284 0400 0000 0000 1100 0000 8c00 0000  ................
-000bd760: bf84 0400 0000 0000 2200 0100 0100 0100  ........".......
-000bd770: 8e84 0400 0000 0000 2100 0000 7c00 0000  ........!...|...
-000bd780: 7884 0400 0000 0000 2100 0200 0800 1000  x.......!.......
-000bd790: 7000 0000 0000 0000 6084 0400 0000 0000  p.......`.......
....
+000bffd0: 0133 b801 33ef 4040 a105 17cb 0056 a0e0  .3..3.@@.....V..
+000bffe0: a027 426f 6f6c 5f74 7900 5b90 a0c0 b390  .'Bool_ty.[.....
+000bfff0: 0509 05a0 c096 c090 9022 6131 0205 f5e1  ........."a1....
 000c0000: a3a2 0400 0000 0000 1300 0100 0100 0104  ................
 000c0010: 8006 0000 0000 0000 2ba2 0400 0000 0000  ........+.......
 000c0020: 2100 0100 1000 0000 d004 0000 0000 0000  !...............

Full output is here:
good.txt
bad.txt

Note that this isn't always a segfault, sometimes you get a fatal out of memory error, or it just hangs forever
(depending how exactly the binary is corrupted), but on a given dune+compiler version it always seems to corrupt the binary the same way.

This is pure OCaml code, no C stubs or Obj.magic and if you look at where the crash actually it, it is a NULL pointer deref in the C runtime startup code, which obviously became corrupted:

==179488== Invalid read of size 8
==179488==    at 0x176B74: fill_hashtable (roots_nat.c:115)
==179488==    by 0x176CEE: init_frame_descriptors (roots_nat.c:158)
==179488==    by 0x1930DC: caml_startup_common (startup_nat.c:127)
==179488==    by 0x1932CE: caml_startup_exn (startup_nat.c:163)
==179488==    by 0x1932CE: caml_startup (startup_nat.c:168)
==179488==    by 0x1466E1: main (main.c:41)
==179488==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

Reproduction

  1. git clone https://github.com/edwintorok/segfault
  2. cd segfault
  3. ./repro.sh

Specifications

  • Version of dune (output of dune --version):
    multiple
    3.2.0
    3.6.1

  • Version of ocaml (output of ocamlc --version)
    4.13.1
    4.14.0

  • Operating system (distribution and version):
    Ubuntu 22.04.1 LTS
    Centos Stream release 8

Additional information

I have reproduced this on 2 different machines running different Linux distributions, and also tried various dune and OCaml versions on the same machine too (see above for versions), they all fail:
Intel(R) Xeon(R) Silver 4108 CPU @ 1.80GHz
Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz

  • Link to gist with verbose output (run dune with the --verbose flag):
    output.txt
@edwintorok
Copy link
Contributor Author

(note that the binary installed by 'dune install' is not corrupted, just the executable in the build directory, but if there are any bugs with artifact substitution it'd be good to find out why the one in the build dir is getting corrupted)

@bobot
Copy link
Collaborator

bobot commented Dec 12, 2022

Normally the binaries in the _build directory are not substituted. The promoted one in the source directory are substituted. Thank you for the testcase, still can you precise if the bug occurs without promoted binary?

@edwintorok
Copy link
Contributor Author

edwintorok commented Dec 12, 2022

We've been using dune-build-info since ~Oct 4 and looking through our internal testsuite it hasn't found any crashes, but it might be that it is just extremely rare to hit the codepath that happened to be corrupted during normal usage (all the unit tests run prior to artifact substitution usually, and our system-level tests which use installed binaries don't have that much coverage).

I'll try to see whether I can modify the testcase to detect corruption without promotion, e.g. diff (the hex transformed) binary pre/post promotion and assert that the only change is really just around the version number placeholders
(I see there are unit tests for this too, but there is obviously some corner case they don't cover).

@bobot
Copy link
Collaborator

bobot commented Dec 12, 2022

Perhaps no need to test it, just does "just the executable in the build directory" was talking about binaries in _build or binaries promoted in the source directory?

@edwintorok
Copy link
Contributor Author

The corruption is for the binary in the source directory (the promoted one).

I have a suspicion this is due to the use of a single global 'buf', and multiple fibers corrupting/overwriting each-other's data, which is why with a single binary's 'dune install' it doesn't reproduce, but it does with promote until clean which promotes both the .bc and .exe in quick succession, quick enough that they're probably both active at the same time.

edwintorok added a commit to edwintorok/dune that referenced this issue Dec 12, 2022
Fixes ocaml#6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
@edwintorok
Copy link
Contributor Author

Yes, moving the place that 'buf' is allocated seems to fix the testcase (lets see what the CI says about the rest of the tests): 48cc447

In general it is probably a bad idea to use global state if you can run multiple builds in parallel (I haven't looked in detail how fibers work in dune or when they're allowed to switch from one fiber to another, but it is probbaly safe to assume that it can switch to another fiber and global mutable state should be avoided).

@edwintorok
Copy link
Contributor Author

However if I'm looking at this correctly this means that Dune can corrupt any binaries that are being promoted/installed in parallel, not just those that use artifact substitution (since there is no way to turn subsitution off, even if unused it'll still copy everything through that shared global 'buf', which may or may not corrupt other binaries too?).
I'll see whether I can come up with a 2nd testcase that shows corruption, but it'd probably be good to backport this fix to older versions of Dune too.

@edwintorok
Copy link
Contributor Author

The only 'scheduling point' I see is let* s = eval t ~conf in artifact_subsitution.ml, which happens only when decoding placeholders, so binaries that have no placeholders are probably safe against this corruption.

edwintorok added a commit to edwintorok/dune that referenced this issue Dec 12, 2022
Fixes ocaml#6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
@edwintorok
Copy link
Contributor Author

I've added a few more testcases, I can't make it corrupt the binaries on 'dune install -j16', but it reliably corrupts the binaries with 'promote until-clean'. I've also added a hex diff of the binaries to check that the diff is constrained to the expected small area, and in the buggy case it can be seen that the diff is much bigger (this should make the test more robust against future changes to the compiler/runtime that might cause the testcase to not segfault anymore)

@rgrinberg
Copy link
Member

@edwintorok would you like to submit a PR to unshare the buffer?

@edwintorok
Copy link
Contributor Author

Yes, see the testcase PR , I've updated it to also contain the fix, not just the testcase.

edwintorok added a commit to edwintorok/dune that referenced this issue Dec 13, 2022
Fixes ocaml#6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
rgrinberg pushed a commit to edwintorok/dune that referenced this issue Dec 20, 2022
Fixes ocaml#6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
@rgrinberg rgrinberg modified the milestones: 3.7.0, 3.6 backports Dec 20, 2022
@rgrinberg rgrinberg linked a pull request Dec 20, 2022 that will close this issue
rgrinberg pushed a commit to edwintorok/dune that referenced this issue Dec 20, 2022
Fixes ocaml#6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
rgrinberg pushed a commit that referenced this issue Dec 20, 2022
Fixes #6668

When performing multiple promotions in parallel (e.g. for a .bc and an .exe)
then sharing a single global buf means that one of them could get corrupted
if the buffer is overwritten by the other build.

Do not use global variables: allocate a new per-file buffer in 'parse' instead!

`cd test && dune build @unit-tests/artifact_substitution/runtest @blackbox-tests/test-cases/versioncorruption` passes now

Signed-off-by: Edwin Török <[email protected]>
emillon added a commit to emillon/opam-repository that referenced this issue Feb 6, 2023
…, dune-rpc, dune-rpc-lwt, dune-private-libs, dune-glob, dune-configurator, dune-build-info, dune-action-plugin and chrome-trace (3.7.0~alpha1)

CHANGES:

- Fix parsing of OCaml errors that contain code excerpts with `...` in them.
  (ocaml/dune#7008, @rgrinberg)

- Pre-emptively clear screen in watch mode (ocaml/dune#6987, fixes ocaml/dune#6884, @rgrinberg)

- Fix cross compilation configuration when a context with targets is itself a
  host of another context (ocaml/dune#6958, fixes ocaml/dune#6843, @rgrinberg)

- Fix parsing of the `<=` operator in *blang* expressions of `dune` files.
  Previously, the operator would be interpreted as `,`. (ocaml/dune#6928, @tatchi)

- Fix `--trace-file` output. Dune now emits a single *complete* event for every
  executed process. Unterminated *async* events are no longer written. (ocaml/dune#6892,
  @rgrinberg)

- Fix preprocessing with `staged_pps` (ocaml/dune#6748, fixes ocaml/dune#6644, @rgrinberg)

- Use colored output with MDX when Dune colors are enabled.
  (ocaml/dune#6462, @MisterDA)

- Make `dune describe workspace` return consistent dependencies for
  executables and for libraries. By default, compile-time dependencies
  towards PPX-rewriters are from now not taken into account (but
  runtime dependencies always are). Compile-time dependencies towards
  PPX-rewriters can be taken into account by providing the
  `--with-pps` flag. (ocaml/dune#6727, fixes ocaml/dune#6486, @esope)

- Print missing newline after `$ dune exec`. (ocaml/dune#6821, fixes ocaml/dune#6700, @rgrinberg,
  @Alizter)

- Fix binary corruption when installing or promoting in parallel (ocaml/dune#6669, fixes
  ocaml/dune#6668, @edwintorok)

- Use colored output with GCC and Clang when compiling C stubs. The
  flag `-fdiagnostics-color=always` is added to the `:standard` set of
  flags. (ocaml/dune#4083, @MisterDA)

- Fix the parsing of decimal and hexadecimal escape literals in `dune`,
  `dune-package`, and other dune s-expression based files (ocaml/dune#6710, @shym)

- Report an error if `dune init ...` would create a "dune" file in a location
  which already contains a "dune" directory (ocaml/dune#6705, @gridbugs)

- Fix the parsing of alerts. They will now show up in diagnostics correctly.
  (ocaml/dune#6678, @rginberg)

- Fix the compilation of modules generated at link time when
  `implicit_transitive_deps` is enabled (ocaml/dune#6642, @rgrinberg)

- Allow `$ dune utop` to load libraries defined in data only directories
  defined using `(subdir ..)` (ocaml/dune#6631, @rgrinberg)

- Format dune files when they are named `dune-file`. This occurs when we enable
  the alternative file names project option. (ocaml/dune#6566, @rgrinberg)

- Move `$ dune ocaml-merlin -dump-config=$dir` to `$ dune ocaml merlin
  dump-config $dir`. (ocaml/dune#6547, @rgrinberg)

- Allow compilation rules to be impacted by `(env ..)` stanzas that modify the
  environment or set binaries. (ocaml/dune#6527, @rgrinberg)

- Coq native mode is now automatically detected by Dune starting with Coq lang
  0.7. `(mode native)` has been deprecated in favour of detection from the
  configuration of Coq. (ocaml/dune#6409, @Alizter)

- Print "Leaving Directory" whenever "Entering Directory" is printed. (ocaml/dune#6149,
  fixes ocaml/dune#138, @cpitclaudel, @rgrinberg)

- Allow `$ dune ocaml dump-dot-merlin` to run in watch mode. Also this command
  shouldn't print "Entering Directory" mesages. (ocaml/dune#6497, @rgrinberg)

- `dune clean` should no longer fail under Windows due to the inability to
  remove the `.lock` file. Also, bring the implementation of the global lock
  under Windows closer to that of Unix. (ocaml/dune#6523, @nojb)

- Remove "Entering Directory" messages for `$ dune install`. (ocaml/dune#6513,
  @rgrinberg)

- Stop passing `-q` flag in `dune coq top`, which allows for `.coqrc` to be
  loaded. (ocaml/dune#6848, fixes ocaml/dune#6847, @Alizter)

- Fix missing dependencies when detecting the kind of C compiler we're using
  (ocaml/dune#6610, fixes ocaml/dune#6415, @emillon)

- Allow `(include_subdirs qualified)` for OCaml projects. (ocaml/dune#6594, fixes ocaml/dune#1084,
  @rgrinberg)

- Accurately determine merlin configuration for all sources selected with
  `copy#` and `copy_files#`. The old heuristic of looking for a module in
  parent directories is removed (ocaml/dune#6594, @rgrinberg)

- Fix inline tests with *js_of_ocaml* and whole program compilation mode
  enabled (ocaml/dune#6645, @hhugo)

- Fix *js_of_ocaml* separate compilation rules when `--enable=effects`
  ,`--enable=use-js-string` or `--toplevel` is used. (ocaml/dune#6714, ocaml/dune#6828, ocaml/dune#6920, @hhugo)

- Fix *js_of_ocaml* separate compilation in presence of linkall (ocaml/dune#6832, ocaml/dune#6916, @hhugo)

- Remove spurious build dir created when running `dune init proj ...` (ocaml/dune#6707,
  fixes ocaml/dune#5429, @gridbugs)

- Allow `--sandbox` to affect `ocamldep` invocations. Previously, they were
  wrongly marked as incompatible (ocaml/dune#6749, @rgrinberg)

- Validate the command line arguments for `$ dune ocaml top-module`. This
  command requires one positional argument (ocaml/dune#6796, fixes ocaml/dune#6793, @rgrinberg)

- Add a `dune cache size` command for displaying the size of the cache (ocaml/dune#6638,
  @Alizter)

- Add 4.14.0 MSVC to CI (ocaml/dune#6917, @jonahbeckford)

- Fix dependency cycle when installing files to the bin section with
  `glob_files` (ocaml/dune#6764, fixes ocaml/dune#6708, @gridbugs)

- Handle "Too many links" errors when using Dune cache on Windows (ocaml/dune#6993, @nojb)
emillon added a commit to emillon/opam-repository that referenced this issue Feb 17, 2023
…, dune-rpc, dune-rpc-lwt, dune-private-libs, dune-glob, dune-configurator, dune-build-info, dune-action-plugin and chrome-trace (3.7.0)

CHANGES:

- Allow running `$ dune exec` in watch mode (with the `-w` flag). In watch mode,
  `$ dune exec` the executed binary whenever it is recompiled. (ocaml/dune#6966,
  @gridbugs)

- `coqdep` is now called once per theory, instead of one time per Coq
  file. This should significantly speed up some builds, as `coqdep`
  startup time is often heavy (ocaml/dune#7048, @Alizter, @ejgallego)

- Add `map_workspace_root` dune-project stanza to allow disabling of
  mapping of workspace root to `/workspace_root`. (ocaml/dune#6988, fixes ocaml/dune#6929,
  @richardlford)

- Fix handling of support files generated by odoc. (ocaml/dune#6913, @jonludlam)

- Fix parsing of OCaml errors that contain code excerpts with `...` in them.
  (ocaml/dune#7008, @rgrinberg)

- Pre-emptively clear screen in watch mode (ocaml/dune#6987, fixes ocaml/dune#6884, @rgrinberg)

- Fix cross compilation configuration when a context with targets is itself a
  host of another context (ocaml/dune#6958, fixes ocaml/dune#6843, @rgrinberg)

- Fix parsing of the `<=` operator in *blang* expressions of `dune` files.
  Previously, the operator would be interpreted as `<`. (ocaml/dune#6928, @tatchi)

- Fix `--trace-file` output. Dune now emits a single *complete* event for every
  executed process. Unterminated *async* events are no longer written. (ocaml/dune#6892,
  @rgrinberg)

- Fix preprocessing with `staged_pps` (ocaml/dune#6748, fixes ocaml/dune#6644, @rgrinberg)

- Use colored output with MDX when Dune colors are enabled.
  (ocaml/dune#6462, @MisterDA)

- Make `dune describe workspace` return consistent dependencies for
  executables and for libraries. By default, compile-time dependencies
  towards PPX-rewriters are from now not taken into account (but
  runtime dependencies always are). Compile-time dependencies towards
  PPX-rewriters can be taken into account by providing the
  `--with-pps` flag. (ocaml/dune#6727, fixes ocaml/dune#6486, @esope)

- Print missing newline after `$ dune exec`. (ocaml/dune#6821, fixes ocaml/dune#6700, @rgrinberg,
  @Alizter)

- Fix binary corruption when installing or promoting in parallel (ocaml/dune#6669, fixes
  ocaml/dune#6668, @edwintorok)

- Use colored output with GCC and Clang when compiling C stubs. The
  flag `-fdiagnostics-color=always` is added to the `:standard` set of
  flags. (ocaml/dune#4083, @MisterDA)

- Fix the parsing of decimal and hexadecimal escape literals in `dune`,
  `dune-package`, and other dune s-expression based files (ocaml/dune#6710, @shym)

- Report an error if `dune init ...` would create a "dune" file in a location
  which already contains a "dune" directory (ocaml/dune#6705, @gridbugs)

- Fix the parsing of alerts. They will now show up in diagnostics correctly.
  (ocaml/dune#6678, @rginberg)

- Fix the compilation of modules generated at link time when
  `implicit_transitive_deps` is enabled (ocaml/dune#6642, @rgrinberg)

- Allow `$ dune utop` to load libraries defined in data only directories
  defined using `(subdir ..)` (ocaml/dune#6631, @rgrinberg)

- Format dune files when they are named `dune-file`. This occurs when we enable
  the alternative file names project option. (ocaml/dune#6566, @rgrinberg)

- Move `$ dune ocaml-merlin -dump-config=$dir` to `$ dune ocaml merlin
  dump-config $dir`. (ocaml/dune#6547, @rgrinberg)

- Allow compilation rules to be impacted by `(env ..)` stanzas that modify the
  environment or set binaries. (ocaml/dune#6527, @rgrinberg)

- Coq native mode is now automatically detected by Dune starting with Coq lang
  0.7. `(mode native)` has been deprecated in favour of detection from the
  configuration of Coq. (ocaml/dune#6409, @Alizter)

- Print "Leaving Directory" whenever "Entering Directory" is printed. (ocaml/dune#6419,
  fixes ocaml/dune#138, @cpitclaudel, @rgrinberg)

- Allow `$ dune ocaml dump-dot-merlin` to run in watch mode. Also this command
  shouldn't print "Entering Directory" mesages. (ocaml/dune#6497, @rgrinberg)

- `dune clean` should no longer fail under Windows due to the inability to
  remove the `.lock` file. Also, bring the implementation of the global lock
  under Windows closer to that of Unix. (ocaml/dune#6523, @nojb)

- Remove "Entering Directory" messages for `$ dune install`. (ocaml/dune#6513,
  @rgrinberg)

- Stop passing `-q` flag in `dune coq top`, which allows for `.coqrc` to be
  loaded. (ocaml/dune#6848, fixes ocaml/dune#6847, @Alizter)

- Fix missing dependencies when detecting the kind of C compiler we're using
  (ocaml/dune#6610, fixes ocaml/dune#6415, @emillon)

- Allow `(include_subdirs qualified)` for OCaml projects. (ocaml/dune#6594, fixes ocaml/dune#1084,
  @rgrinberg)

- Accurately determine merlin configuration for all sources selected with
  `copy#` and `copy_files#`. The old heuristic of looking for a module in
  parent directories is removed (ocaml/dune#6594, @rgrinberg)

- Fix inline tests with *js_of_ocaml* and whole program compilation mode
  enabled (ocaml/dune#6645, @hhugo)

- Fix *js_of_ocaml* separate compilation rules when `--enable=effects`
  ,`--enable=use-js-string` or `--toplevel` is used. (ocaml/dune#6714, ocaml/dune#6828, ocaml/dune#6920, @hhugo)

- Fix *js_of_ocaml* separate compilation in presence of linkall (ocaml/dune#6832, ocaml/dune#6916, @hhugo)

- Remove spurious build dir created when running `dune init proj ...` (ocaml/dune#6707,
  fixes ocaml/dune#5429, @gridbugs)

- Allow `--sandbox` to affect `ocamldep` invocations. Previously, they were
  wrongly marked as incompatible (ocaml/dune#6749, @rgrinberg)

- Validate the command line arguments for `$ dune ocaml top-module`. This
  command requires one positional argument (ocaml/dune#6796, fixes ocaml/dune#6793, @rgrinberg)

- Add a `dune cache size` command for displaying the size of the cache (ocaml/dune#6638,
  @Alizter)

- Fix dependency cycle when installing files to the bin section with
  `glob_files` (ocaml/dune#6764, fixes ocaml/dune#6708, @gridbugs)

- Handle "Too many links" errors when using Dune cache on Windows (ocaml/dune#6993, @nojb)

- Allow the `cinaps` stanza to set a custom alias. By default, if the alias is
  not set then the cinaps actions will be attached to both `@cinaps` and
  `@runtest` (ocaml/dune#6991, @rgrinberg)

- Add `(using ctypes 0.3)`. When used, paths in `(ctypes)` are interpreted
  relative to where the stanza is defined. (ocaml/dune#6883, fixes ocaml/dune#5325, @emillon)

- Auto-detect `dune-workspace` files as `dune` files in Emacs (ocaml/dune#7061,
  @ilankri)

- Add native support for polling mode on Windows (ocaml/dune#7010, @yams-yams, @nojb)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants