From b30bc4dce08e970da292af37c71a17254acde90d Mon Sep 17 00:00:00 2001 From: Haoxiang Fei Date: Tue, 2 Apr 2024 16:34:52 +0800 Subject: [PATCH] fix: use `Long_val` for sendfile() parameters to fix file copying in docker (#10333) * fix: sendfile() in docker Signed-off-by: Haoxiang Fei * use ssize_t for return value Co-authored-by: Etienne Millon Signed-off-by: Haoxiang Fei * update test Signed-off-by: Etienne Millon * Add changelog Signed-off-by: Etienne Millon --------- Signed-off-by: Haoxiang Fei Signed-off-by: Haoxiang Fei Signed-off-by: Etienne Millon Co-authored-by: Etienne Millon Co-authored-by: Etienne Millon --- 10333.md | 2 ++ otherlibs/stdune/src/copyfile_stubs.c | 6 +++--- test/blackbox-tests/test-cases/sendfile-large-file.t | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 10333.md diff --git a/10333.md b/10333.md new file mode 100644 index 000000000000..945551382465 --- /dev/null +++ b/10333.md @@ -0,0 +1,2 @@ +- fix overflow in sendfile stubs (copy of large files could fail or end with + truncated files) (#10333, @tonyfettes) diff --git a/otherlibs/stdune/src/copyfile_stubs.c b/otherlibs/stdune/src/copyfile_stubs.c index 09c9a1b140ab..4ab47f35c190 100644 --- a/otherlibs/stdune/src/copyfile_stubs.c +++ b/otherlibs/stdune/src/copyfile_stubs.c @@ -73,8 +73,8 @@ CAMLprim value stdune_copyfile(value v_from, value v_to) { caml_failwith("copyfile: only on macos"); } -static int dune_sendfile(int in, int out, int length) { - int ret; +static int dune_sendfile(int in, int out, size_t length) { + ssize_t ret; while (length > 0) { ret = sendfile(out, in, NULL, length); if (ret < 0) { @@ -90,7 +90,7 @@ CAMLprim value stdune_sendfile(value v_in, value v_out, value v_size) { caml_release_runtime_system(); /* TODO Use copy_file_range once we have a good mechanism to test for its * existence */ - int ret = dune_sendfile(FD_val(v_in), FD_val(v_out), Int_val(v_size)); + int ret = dune_sendfile(FD_val(v_in), FD_val(v_out), Long_val(v_size)); caml_acquire_runtime_system(); if (ret < 0) { uerror("sendfile", Nothing); diff --git a/test/blackbox-tests/test-cases/sendfile-large-file.t b/test/blackbox-tests/test-cases/sendfile-large-file.t index ab6e766d6282..c7b1cd860e22 100644 --- a/test/blackbox-tests/test-cases/sendfile-large-file.t +++ b/test/blackbox-tests/test-cases/sendfile-large-file.t @@ -17,6 +17,6 @@ We create a large file and check that it is copied completely. 4294967299 $ dune_cmd stat size _build/default/file.dat - 3 + 4294967299 (3 indicates that the file size is taken modulo 2**32)