aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/handle.cpp10
-rw-r--r--src/path.cpp7
-rw-r--r--src/process.cpp6
3 files changed, 19 insertions, 4 deletions
diff --git a/src/handle.cpp b/src/handle.cpp
index 4678519..ba1e4b5 100644
--- a/src/handle.cpp
+++ b/src/handle.cpp
@@ -14,6 +14,7 @@
#include <cassert>
#include <cstddef>
+#include <limits>
#include <sstream>
#include <stdexcept>
#include <utility>
@@ -83,7 +84,10 @@ bool Handle::read_chunk(Buffer& buffer) const {
buffer.resize(max_chunk_size);
DWORD nb_read = 0;
- const auto ret = ::ReadFile(m_impl.get(), buffer.data(), buffer.size(), &nb_read, NULL);
+ if (buffer.size() > std::numeric_limits<DWORD>::max())
+ throw std::range_error{"Read buffer is too large"};
+ const auto ret =
+ ::ReadFile(m_impl.get(), buffer.data(), static_cast<DWORD>(buffer.size()), &nb_read, NULL);
buffer.resize(nb_read);
@@ -121,7 +125,9 @@ Buffer Handle::read() const {
void Handle::write(const void* data, std::size_t nb) const {
DWORD nb_written = 0;
- const auto ret = ::WriteFile(m_impl.get(), data, nb, &nb_written, NULL);
+ if (nb > std::numeric_limits<DWORD>::max())
+ throw std::range_error{"Write buffer is too large"};
+ const auto ret = ::WriteFile(m_impl.get(), data, static_cast<DWORD>(nb), &nb_written, NULL);
if (!ret) {
throw error::windows(GetLastError(), "WriteFile");
diff --git a/src/path.cpp b/src/path.cpp
index 3df5918..7848df2 100644
--- a/src/path.cpp
+++ b/src/path.cpp
@@ -9,6 +9,8 @@
#include <windows.h>
+#include <limits>
+#include <stdexcept>
#include <string>
#include <vector>
@@ -23,7 +25,10 @@ std::wstring do_canonicalize(const std::wstring& path) {
buffer.resize(init_buffer_size);
while (true) {
- const auto nch = ::GetFullPathNameW(path.c_str(), buffer.size(), buffer.data(), NULL);
+ if (buffer.size() > std::numeric_limits<DWORD>::max())
+ throw std::range_error{"Path buffer is too large"};
+ const auto nch = ::GetFullPathNameW(
+ path.c_str(), static_cast<DWORD>(buffer.size()), buffer.data(), NULL);
if (nch == 0) {
throw error::windows(GetLastError(), "GetFullPathNameW");
diff --git a/src/process.cpp b/src/process.cpp
index bac8bb8..2be7f0d 100644
--- a/src/process.cpp
+++ b/src/process.cpp
@@ -19,6 +19,7 @@
#include <cstddef>
#include <cstring>
+#include <limits>
#include <sstream>
#include <stdexcept>
#include <string>
@@ -305,7 +306,10 @@ std::string Process::get_exe_path() {
while (true) {
SetLastError(ERROR_SUCCESS);
- const auto nch = ::GetModuleFileNameW(NULL, buffer.data(), buffer.size());
+ if (buffer.size() > std::numeric_limits<DWORD>::max())
+ throw std::range_error{"Path buffer is too large"};
+ const auto nch =
+ ::GetModuleFileNameW(NULL, buffer.data(), static_cast<DWORD>(buffer.size()));
if (nch == 0) {
throw error::windows(GetLastError(), "GetModuleFileNameW");