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);