Skip to content

Commit

Permalink
eio_linux: retry openat2 on EAGAIN
Browse files Browse the repository at this point in the history
CI fails sometimes with this error. The man-page says:

> the kernel could not ensure that a ".." component didn't escape (due
> to a race condition or potential attack). The caller may choose to
> retry the openat2() call.
  • Loading branch information
talex5 committed Feb 15, 2024
1 parent f5232a0 commit 3adce92
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions lib_eio_linux/low_level.ml
Original file line number Diff line number Diff line change
Expand Up @@ -270,15 +270,21 @@ let with_chunk ~fallback fn =
| None ->
fallback ()

let openat2 ~sw ?seekable ~access ~flags ~perm ~resolve ?dir path =
let use dir =
let res = Sched.enter "openat2" (enqueue_openat2 (access, flags, perm, resolve, dir, path)) in
let rec openat2 ~sw ?seekable ~access ~flags ~perm ~resolve ?dir path =
let use dir_opt =
let res = Sched.enter "openat2" (enqueue_openat2 (access, flags, perm, resolve, dir_opt, path)) in
if res < 0 then (
Switch.check sw; (* If cancelled, report that instead. *)
raise @@ Err.wrap_fs (Uring.error_of_errno res) "openat2" ""
);
let fd : Unix.file_descr = Obj.magic res in
Fd.of_unix ~sw ?seekable ~close_unix:true fd
match Uring.error_of_errno res with
| EAGAIN ->
(* Linux can return this due to a concurrent update.
It also seems to happen sometimes with no concurrent updates. *)
openat2 ~sw ?seekable ~access ~flags ~perm ~resolve ?dir path
| e -> raise @@ Err.wrap_fs e "openat2" ""
) else (
let fd : Unix.file_descr = Obj.magic res in
Fd.of_unix ~sw ?seekable ~close_unix:true fd
)
in
match dir with
| None -> use None
Expand Down

0 comments on commit 3adce92

Please sign in to comment.