From e8b4279062e9ddafa9923cb9d24e3003fa6ee246 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 23 Apr 2023 21:21:32 +0200 Subject: [PATCH] Don't use sendfile64() if input and output are the same to avoid EBADF This does not work and leads to sendfile64() running into EBADF ("Bad file descriptor"). --- io/copy.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/copy.h b/io/copy.h index dba0ec2..fcf546c 100644 --- a/io/copy.h +++ b/io/copy.h @@ -103,7 +103,7 @@ void CopyHelper::callbackCopy(std::istream &input, std::ostream &out template void CopyHelper::copy(NativeFileStream &input, NativeFileStream &output, std::uint64_t count) { #ifdef CPP_UTILITIES_USE_SEND_FILE - if (output.fileDescriptor() != -1 && input.fileDescriptor() != -1) { + if (output.fileDescriptor() != -1 && input.fileDescriptor() != -1 && output.fileDescriptor() != input.fileDescriptor()) { const auto inputTellg = output.tellg(); const auto inputTellp = output.tellp(); const auto outputTellg = output.tellg(); @@ -151,7 +151,7 @@ void CopyHelper::callbackCopy(NativeFileStream &input, NativeFileStr const std::function &isAborted, const std::function &callback) { #ifdef CPP_UTILITIES_USE_SEND_FILE - if (output.fileDescriptor() != -1 && input.fileDescriptor() != -1) { + if (output.fileDescriptor() != -1 && input.fileDescriptor() != -1 && output.fileDescriptor() != input.fileDescriptor()) { const auto inputTellg = output.tellg(); const auto inputTellp = output.tellp(); const auto outputTellg = output.tellg();