1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 03:28:13 +00:00

Everywhere: Fix incorrect usages of AK::Checked

Specifically, explicitly specify the checked type, use the resulting
value instead of doing the same calculation twice, and break down
calculations to discrete operations to ensure no intermediary overflows
are missed.
This commit is contained in:
Idan Horowitz 2021-07-04 20:23:26 +03:00 committed by Linus Groh
parent 3f70efed9c
commit 301c1a3a58
6 changed files with 16 additions and 15 deletions

View file

@ -131,42 +131,42 @@ template<typename T>
[[nodiscard]] inline bool copy_n_from_user(T* dest, const T* src, size_t count)
{
static_assert(IsTriviallyCopyable<T>);
Checked size = sizeof(T);
Checked<size_t> size = sizeof(T);
size *= count;
if (size.has_overflow())
return false;
return copy_from_user(dest, src, sizeof(T) * count);
return copy_from_user(dest, src, size.value());
}
template<typename T>
[[nodiscard]] inline bool copy_n_to_user(T* dest, const T* src, size_t count)
{
static_assert(IsTriviallyCopyable<T>);
Checked size = sizeof(T);
Checked<size_t> size = sizeof(T);
size *= count;
if (size.has_overflow())
return false;
return copy_to_user(dest, src, sizeof(T) * count);
return copy_to_user(dest, src, size.value());
}
template<typename T>
[[nodiscard]] inline bool copy_n_from_user(T* dest, Userspace<const T*> src, size_t count)
{
static_assert(IsTriviallyCopyable<T>);
Checked size = sizeof(T);
Checked<size_t> size = sizeof(T);
size *= count;
if (size.has_overflow())
return false;
return copy_from_user(dest, src.unsafe_userspace_ptr(), sizeof(T) * count);
return copy_from_user(dest, src.unsafe_userspace_ptr(), size.value());
}
template<typename T>
[[nodiscard]] inline bool copy_n_to_user(Userspace<T*> dest, const T* src, size_t count)
{
static_assert(IsTriviallyCopyable<T>);
Checked size = sizeof(T);
Checked<size_t> size = sizeof(T);
size *= count;
if (size.has_overflow())
return false;
return copy_to_user(dest.unsafe_userspace_ptr(), src, sizeof(T) * count);
return copy_to_user(dest.unsafe_userspace_ptr(), src, size.value());
}