summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Process.h23
1 files changed, 21 insertions, 2 deletions
diff --git a/Kernel/Process.h b/Kernel/Process.h
index fa52440707..7513de3eb8 100644
--- a/Kernel/Process.h
+++ b/Kernel/Process.h
@@ -26,6 +26,7 @@
#pragma once
+#include <AK/Checked.h>
#include <AK/FixedArray.h>
#include <AK/HashMap.h>
#include <AK/InlineLinkedList.h>
@@ -332,8 +333,17 @@ public:
[[nodiscard]] bool validate_read(const void*, size_t) const;
[[nodiscard]] bool validate_write(void*, size_t) const;
+
template<typename T>
- [[nodiscard]] bool validate_read_typed(T* value, size_t count = 1) { return validate_read(value, sizeof(T) * count); }
+ [[nodiscard]] bool validate_read_typed(T* value, size_t count = 1)
+ {
+ Checked size = sizeof(T);
+ size *= count;
+ if (size.has_overflow())
+ return false;
+ return validate_read(value, size.value());
+ }
+
template<typename T>
[[nodiscard]] bool validate_read_and_copy_typed(T* dest, const T* src)
{
@@ -343,8 +353,17 @@ public:
}
return validated;
}
+
template<typename T>
- [[nodiscard]] bool validate_write_typed(T* value, size_t count = 1) { return validate_write(value, sizeof(T) * count); }
+ [[nodiscard]] bool validate_write_typed(T* value, size_t count = 1)
+ {
+ Checked size = sizeof(T);
+ size *= count;
+ if (size.has_overflow())
+ return false;
+ return validate_write(value, size.value());
+ }
+
template<typename DataType, typename SizeType>
[[nodiscard]] bool validate(const Syscall::MutableBufferArgument<DataType, SizeType>&);
template<typename DataType, typename SizeType>