Index: third_party/crashpad/crashpad/util/file/file_io_posix.cc |
diff --git a/third_party/crashpad/crashpad/util/file/file_io_posix.cc b/third_party/crashpad/crashpad/util/file/file_io_posix.cc |
index 1534db15a68cab2cdb057a8edae1a29c92ef1553..494412440f493b6802fa0b00a3103c99716bdae6 100644 |
--- a/third_party/crashpad/crashpad/util/file/file_io_posix.cc |
+++ b/third_party/crashpad/crashpad/util/file/file_io_posix.cc |
@@ -19,63 +19,49 @@ |
#include <sys/stat.h> |
#include <unistd.h> |
+#include <algorithm> |
+#include <limits> |
+ |
#include "base/files/file_path.h" |
#include "base/logging.h" |
-#include "base/numerics/safe_conversions.h" |
#include "base/posix/eintr_wrapper.h" |
+namespace crashpad { |
+ |
namespace { |
struct ReadTraits { |
- using VoidBufferType = void*; |
- using CharBufferType = char*; |
- static crashpad::FileOperationResult Operate(int fd, |
- CharBufferType buffer, |
- size_t size) { |
+ using BufferType = void*; |
+ static FileOperationResult Operate(int fd, BufferType buffer, size_t size) { |
return read(fd, buffer, size); |
} |
}; |
struct WriteTraits { |
- using VoidBufferType = const void*; |
- using CharBufferType = const char*; |
- static crashpad::FileOperationResult Operate(int fd, |
- CharBufferType buffer, |
- size_t size) { |
+ using BufferType = const void*; |
+ static FileOperationResult Operate(int fd, BufferType buffer, size_t size) { |
return write(fd, buffer, size); |
} |
}; |
template <typename Traits> |
-crashpad::FileOperationResult |
-ReadOrWrite(int fd, typename Traits::VoidBufferType buffer, size_t size) { |
- typename Traits::CharBufferType buffer_c = |
- reinterpret_cast<typename Traits::CharBufferType>(buffer); |
- |
- crashpad::FileOperationResult total_bytes = 0; |
- while (size > 0) { |
- crashpad::FileOperationResult bytes = |
- HANDLE_EINTR(Traits::Operate(fd, buffer_c, size)); |
- if (bytes < 0) { |
- return bytes; |
- } else if (bytes == 0) { |
- break; |
- } |
- |
- buffer_c += bytes; |
- size -= bytes; |
- total_bytes += bytes; |
+FileOperationResult ReadOrWrite(int fd, |
+ typename Traits::BufferType buffer, |
+ size_t size) { |
+ constexpr size_t kMaxReadWriteSize = |
+ static_cast<size_t>(std::numeric_limits<ssize_t>::max()); |
+ const size_t requested_bytes = std::min(size, kMaxReadWriteSize); |
+ |
+ FileOperationResult transacted_bytes = |
+ HANDLE_EINTR(Traits::Operate(fd, buffer, requested_bytes)); |
+ if (transacted_bytes < 0) { |
+ return -1; |
} |
- return total_bytes; |
+ DCHECK_LE(static_cast<size_t>(transacted_bytes), requested_bytes); |
+ return transacted_bytes; |
} |
-} // namespace |
- |
-namespace crashpad { |
- |
-namespace { |
- |
FileHandle OpenFileForOutput(int rdwr_or_wronly, |
const base::FilePath& path, |
FileWriteMode mode, |
@@ -108,16 +94,23 @@ FileHandle OpenFileForOutput(int rdwr_or_wronly, |
} // namespace |
-FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size) { |
- return ReadOrWrite<ReadTraits>(file, buffer, size); |
-} |
+namespace internal { |
+ |
+const char kNativeReadFunctionName[] = "read"; |
+const char kNativeWriteFunctionName[] = "write"; |
-FileOperationResult WriteFile(FileHandle file, |
- const void* buffer, |
- size_t size) { |
+FileOperationResult NativeWriteFile(FileHandle file, |
+ const void* buffer, |
+ size_t size) { |
return ReadOrWrite<WriteTraits>(file, buffer, size); |
} |
+} // namespace internal |
+ |
+FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size) { |
+ return ReadOrWrite<ReadTraits>(file, buffer, size); |
+} |
+ |
FileHandle OpenFileForRead(const base::FilePath& path) { |
return HANDLE_EINTR( |
open(path.value().c_str(), O_RDONLY | O_NOCTTY | O_CLOEXEC)); |
@@ -199,4 +192,18 @@ FileOffset LoggingFileSizeByHandle(FileHandle file) { |
return st.st_size; |
} |
+FileHandle StdioFileHandle(StdioStream stdio_stream) { |
+ switch (stdio_stream) { |
+ case StdioStream::kStandardInput: |
+ return STDIN_FILENO; |
+ case StdioStream::kStandardOutput: |
+ return STDOUT_FILENO; |
+ case StdioStream::kStandardError: |
+ return STDERR_FILENO; |
+ } |
+ |
+ NOTREACHED(); |
+ return kInvalidFileHandle; |
+} |
+ |
} // namespace crashpad |