From 780c08a63efb65aed65da57c36f1c5b10f25cc1d Mon Sep 17 00:00:00 2001 From: cjihrig Date: Tue, 29 Oct 2019 18:30:15 -0400 Subject: [PATCH] unix: refactor uv__fs_copyfile() logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Unix/macOS uv__fs_copyfile() implementation falls back to using uv_fs_sendfile(). This commit refactors the error handling to use the sendfile() req's result field, which is an ssize_t instead of using the return value, which is an int. The int value was coming back as a negative number for some large files. Refs: https://github.com/nodejs/node/issues/30085 PR-URL: https://github.com/libuv/libuv/pull/2533 Reviewed-By: Santiago Gimeno Reviewed-By: Saúl Ibarra Corretgé Reviewed-By: Richard Lau --- src/unix/fs.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/unix/fs.c b/src/unix/fs.c index b37cfbbc7a0..fae8f48d4d2 100644 --- a/src/unix/fs.c +++ b/src/unix/fs.c @@ -999,6 +999,7 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) { int err; size_t bytes_to_send; int64_t in_offset; + ssize_t bytes_written; dstfd = -1; err = 0; @@ -1076,18 +1077,17 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) { bytes_to_send = src_statsbuf.st_size; in_offset = 0; while (bytes_to_send != 0) { - err = uv_fs_sendfile(NULL, - &fs_req, - dstfd, - srcfd, - in_offset, - bytes_to_send, - NULL); + uv_fs_sendfile(NULL, &fs_req, dstfd, srcfd, in_offset, bytes_to_send, NULL); + bytes_written = fs_req.result; uv_fs_req_cleanup(&fs_req); - if (err < 0) + + if (bytes_written < 0) { + err = bytes_written; break; - bytes_to_send -= fs_req.result; - in_offset += fs_req.result; + } + + bytes_to_send -= bytes_written; + in_offset += bytes_written; } out: