浏览代码

Kernel: Prevent using copy_from_user() for timespec/timeval

These structs can be inconsistent, for example if the amount of microseconds is
negative or larger than 1'000'000. Therefore, they should not be copied as-is.
Use copy_time_from_user instead.
Ben Wiederhake 4 年之前
父节点
当前提交
e510c41fd2
共有 2 个文件被更改,包括 22 次插入0 次删除
  1. 2 0
      AK/Forward.h
  2. 20 0
      Kernel/StdLib.h

+ 2 - 0
AK/Forward.h

@@ -43,6 +43,7 @@ class String;
 class StringBuilder;
 class StringImpl;
 class StringView;
+class Time;
 class URL;
 class FlyString;
 class Utf32View;
@@ -175,6 +176,7 @@ using AK::String;
 using AK::StringBuilder;
 using AK::StringImpl;
 using AK::StringView;
+using AK::Time;
 using AK::Traits;
 using AK::URL;
 using AK::Utf32View;

+ 20 - 0
Kernel/StdLib.h

@@ -102,6 +102,26 @@ template<typename T>
     return copy_from_user(dest, src.unsafe_userspace_ptr(), sizeof(T));
 }
 
+#define DEPRECATE_COPY_FROM_USER_TYPE(T, REPLACEMENT)                                                                                \
+    template<>                                                                                                                       \
+    [[nodiscard]] inline __attribute__((deprecated("use " #REPLACEMENT " instead"))) bool copy_from_user<T>(T*, const T*)            \
+    {                                                                                                                                \
+        VERIFY_NOT_REACHED();                                                                                                        \
+    }                                                                                                                                \
+    template<>                                                                                                                       \
+    [[nodiscard]] inline __attribute__((deprecated("use " #REPLACEMENT " instead"))) bool copy_from_user<T>(T*, Userspace<const T*>) \
+    {                                                                                                                                \
+        VERIFY_NOT_REACHED();                                                                                                        \
+    }                                                                                                                                \
+    template<>                                                                                                                       \
+    [[nodiscard]] inline __attribute__((deprecated("use " #REPLACEMENT " instead"))) bool copy_from_user<T>(T*, Userspace<T*>)       \
+    {                                                                                                                                \
+        VERIFY_NOT_REACHED();                                                                                                        \
+    }
+
+DEPRECATE_COPY_FROM_USER_TYPE(timespec, copy_time_from_user)
+DEPRECATE_COPY_FROM_USER_TYPE(timeval, copy_time_from_user)
+
 template<typename T>
 [[nodiscard]] inline bool copy_to_user(Userspace<T*> dest, const T* src)
 {