Explorar o código

Kernel: Prevent inconsistent state after invalid read

copy_from_user can fail, for example when the user-supplied pointer is just before
the end of mapped address space. In that case, the first few bytes would get copied,
permanently overwriting the internal state of the Socket, potentially leaving it
in an inconsistent or at least difficult-to-predict state.
Ben Wiederhake %!s(int64=4) %!d(string=hai) anos
pai
achega
b374dd03bd
Modificáronse 1 ficheiros con 6 adicións e 2 borrados
  1. 6 2
      Kernel/Net/Socket.cpp

+ 6 - 2
Kernel/Net/Socket.cpp

@@ -134,8 +134,12 @@ KResult Socket::setsockopt(int level, int option, Userspace<const void*> user_va
     case SO_TIMESTAMP:
     case SO_TIMESTAMP:
         if (user_value_size != sizeof(int))
         if (user_value_size != sizeof(int))
             return EINVAL;
             return EINVAL;
-        if (!copy_from_user(&m_timestamp, static_ptr_cast<const int*>(user_value)))
-            return EFAULT;
+        {
+            int timestamp;
+            if (!copy_from_user(&timestamp, static_ptr_cast<const int*>(user_value)))
+                return EFAULT;
+            m_timestamp = timestamp;
+        }
         if (m_timestamp && (domain() != AF_INET || type() == SOCK_STREAM)) {
         if (m_timestamp && (domain() != AF_INET || type() == SOCK_STREAM)) {
             // FIXME: Support SO_TIMESTAMP for more protocols?
             // FIXME: Support SO_TIMESTAMP for more protocols?
             m_timestamp = 0;
             m_timestamp = 0;