[haiku-commits] haiku: hrev52048 - src/system/kernel/fs

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 30 Jun 2018 09:47:30 -0400 (EDT)

hrev52048 adds 1 changeset to branch 'master'
old head: 65df4b51f5b60ed628d77d639a99c5b0153240a9
new head: 4f5ed463b5343cc560c5ed7994484102394b8412
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=4f5ed463b534+%5E65df4b51f5b6

----------------------------------------------------------------------------

4f5ed463b534: kernel: vfs: common_fcntl() now uses memcpy() for kernel calls.
  
  instead of user_memcpy().
  
  * fix #14204: the NTFS filesystem kernel addon uses the fcntl system call to
  lock the underlying device. The user_memcpy replacement in the x86 compat
  branch adds range checks for the user pointer, which exposes such problems.

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev52048
Commit:      4f5ed463b5343cc560c5ed7994484102394b8412
URL:         https://git.haiku-os.org/haiku/commit/?id=4f5ed463b534
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Jun 30 13:27:11 2018 UTC

Ticket:      https://dev.haiku-os.org/ticket/14204

----------------------------------------------------------------------------

1 file changed, 16 insertions(+), 5 deletions(-)
src/system/kernel/fs/vfs.cpp | 21 ++++++++++++++++-----

----------------------------------------------------------------------------

diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp
index 4f1657a55c..9c5f3962c0 100644
--- a/src/system/kernel/fs/vfs.cpp
+++ b/src/system/kernel/fs/vfs.cpp
@@ -6116,10 +6116,11 @@ common_fcntl(int fd, int op, size_t argument, bool 
kernel)
        if (op == F_SETLK || op == F_SETLKW || op == F_GETLK) {
                if (descriptor->type != FDTYPE_FILE)
                        status = B_BAD_VALUE;
+               else if (kernel)
+                       memcpy(&flock, (struct flock*)argument, sizeof(struct 
flock));
                else if (user_memcpy(&flock, (struct flock*)argument,
                                sizeof(struct flock)) != B_OK)
                        status = B_BAD_ADDRESS;
-
                if (status != B_OK) {
                        put_fd(descriptor);
                        return status;
@@ -6208,16 +6209,26 @@ common_fcntl(int fd, int op, size_t argument, bool 
kernel)
                                                // no conflicting lock found, 
copy back the same struct
                                                // we were given except change 
type to F_UNLCK
                                                flock.l_type = F_UNLCK;
-                                               status = user_memcpy((struct 
flock*)argument, &flock,
-                                                       sizeof(struct flock));
+                                               if (kernel) {
+                                                       memcpy((struct 
flock*)argument, &flock,
+                                                               sizeof(struct 
flock));
+                                               } else {
+                                                       status = 
user_memcpy((struct flock*)argument,
+                                                               &flock, 
sizeof(struct flock));
+                                               }
                                        } else {
                                                // a conflicting lock was 
found, copy back its range and
                                                // type
                                                if (normalizedLock.l_len == 
OFF_MAX)
                                                        normalizedLock.l_len = 
0;
 
-                                               status = user_memcpy((struct 
flock*)argument,
-                                                       &normalizedLock, 
sizeof(struct flock));
+                                               if (kernel) {
+                                                       memcpy((struct 
flock*)argument,
+                                                               
&normalizedLock, sizeof(struct flock));
+                                               } else {
+                                                       status = 
user_memcpy((struct flock*)argument,
+                                                               
&normalizedLock, sizeof(struct flock));
+                                               }
                                        }
                                }
                        } else


Other related posts:

  • » [haiku-commits] haiku: hrev52048 - src/system/kernel/fs - Jérôme Duval