[haiku-commits] haiku: hrev52882 - src/add-ons/kernel/drivers/disk/usb/usb_disk headers/private/kernel/util

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 17 Feb 2019 13:27:23 -0500 (EST)

hrev52882 adds 2 changesets to branch 'master'
old head: 8670326a9aead7549d02bd8f24cd8ebc578f33de
new head: c61fa718f28a2e7cf8aa3eb3ad27e67362c53be9
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=c61fa718f28a+%5E8670326a9aea

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

6b0251e1bd8c: syscall_args: Remove R5 compatibility hack.

c61fa718f28a: usb_disk: Handle user buffer-to-partial buffer copies correctly.
  
  Discovered by an SMAP violation triggered by running "writembr" on a
  USB drive.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

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

2 files changed, 11 insertions(+), 8 deletions(-)
headers/private/kernel/util/syscall_args.h              |  6 ------
.../kernel/drivers/disk/usb/usb_disk/usb_disk.cpp       | 13 +++++++++++--

############################################################################

Commit:      6b0251e1bd8c21b5425fbbd84ebbb3d8f4042fdb
URL:         https://git.haiku-os.org/haiku/commit/?id=6b0251e1bd8c
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sun Feb 17 18:06:49 2019 UTC

syscall_args: Remove R5 compatibility hack.

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

diff --git a/headers/private/kernel/util/syscall_args.h 
b/headers/private/kernel/util/syscall_args.h
index 46eab7342c..5da82948b7 100644
--- a/headers/private/kernel/util/syscall_args.h
+++ b/headers/private/kernel/util/syscall_args.h
@@ -6,12 +6,6 @@
 #include <kernel.h>
 
 
-// Hack to be able to use the IS_USER_ADDRESS macro when compiling for R5.
-#ifdef R5_MEMORY_LAYOUT
-#      undef KERNEL_BASE
-#      define KERNEL_BASE 0x0
-#endif
-
 // copy_ref_var_from_user
 template<typename T>
 inline

############################################################################

Revision:    hrev52882
Commit:      c61fa718f28a2e7cf8aa3eb3ad27e67362c53be9
URL:         https://git.haiku-os.org/haiku/commit/?id=c61fa718f28a
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sun Feb 17 18:07:07 2019 UTC

usb_disk: Handle user buffer-to-partial buffer copies correctly.

Discovered by an SMAP violation triggered by running "writembr" on a
USB drive.

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

diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp 
b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
index 3731e6b68a..dd26443288 100644
--- a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
+++ b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
@@ -16,6 +16,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <kernel.h>
 #include <fs/devfs.h>
 
 #include "scsi_sense.h"
@@ -2027,7 +2028,10 @@ usb_disk_read(void *cookie, off_t position, void 
*buffer, size_t *length)
                result = usb_disk_prepare_partial_buffer(lun, position, *length,
                        partialBuffer, blockBuffer, blockPosition, blockCount);
                if (result == B_OK) {
-                       memcpy(buffer, partialBuffer, *length);
+                       if (IS_USER_ADDRESS(buffer))
+                               result = user_memcpy(buffer, partialBuffer, 
*length);
+                       else
+                               memcpy(buffer, partialBuffer, *length);
                        free(blockBuffer);
                }
        } else {
@@ -2075,7 +2079,12 @@ usb_disk_write(void *cookie, off_t position, const void 
*buffer,
                result = usb_disk_prepare_partial_buffer(lun, position, *length,
                        partialBuffer, blockBuffer, blockPosition, blockCount);
                if (result == B_OK) {
-                       memcpy(partialBuffer, buffer, *length);
+                       if (IS_USER_ADDRESS(buffer))
+                               result = user_memcpy(partialBuffer, buffer, 
*length);
+                       else
+                               memcpy(partialBuffer, buffer, *length);
+               }
+               if (result == B_OK) {
                        size_t blockLength = blockCount * lun->block_size;
                        result = usb_disk_block_write(lun, blockPosition, 
blockCount,
                                blockBuffer, &blockLength);


Other related posts:

  • » [haiku-commits] haiku: hrev52882 - src/add-ons/kernel/drivers/disk/usb/usb_disk headers/private/kernel/util - waddlesplash