Check for user buffers and properly use user_memcpy() in that case. Fixes #4770.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33564 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
8637183adf
commit
baddb6942c
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <ByteOrder.h>
|
#include <ByteOrder.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
#include <kernel.h>
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <util/DoublyLinkedList.h>
|
#include <util/DoublyLinkedList.h>
|
||||||
|
|
||||||
|
@ -1413,6 +1414,10 @@ write_data(net_buffer* _buffer, size_t offset, const void* data, size_t size)
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t written = min_c(size, node->used - offset);
|
size_t written = min_c(size, node->used - offset);
|
||||||
|
if (IS_USER_ADDRESS(data)) {
|
||||||
|
if (user_memcpy(node->start + offset, data, written) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
} else
|
||||||
memcpy(node->start + offset, data, written);
|
memcpy(node->start + offset, data, written);
|
||||||
|
|
||||||
size -= written;
|
size -= written;
|
||||||
|
@ -1456,6 +1461,10 @@ read_data(net_buffer* _buffer, size_t offset, void* data, size_t size)
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t bytesRead = min_c(size, node->used - offset);
|
size_t bytesRead = min_c(size, node->used - offset);
|
||||||
|
if (IS_USER_ADDRESS(data)) {
|
||||||
|
if (user_memcpy(data, node->start + offset, bytesRead) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
} else
|
||||||
memcpy(data, node->start + offset, bytesRead);
|
memcpy(data, node->start + offset, bytesRead);
|
||||||
|
|
||||||
size -= bytesRead;
|
size -= bytesRead;
|
||||||
|
@ -1572,9 +1581,13 @@ prepend_data(net_buffer* buffer, const void* data, size_t size)
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (contiguousBuffer)
|
if (contiguousBuffer) {
|
||||||
|
if (IS_USER_ADDRESS(data)) {
|
||||||
|
if (user_memcpy(contiguousBuffer, data, size) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
} else
|
||||||
memcpy(contiguousBuffer, data, size);
|
memcpy(contiguousBuffer, data, size);
|
||||||
else
|
} else
|
||||||
write_data(buffer, 0, data, size);
|
write_data(buffer, 0, data, size);
|
||||||
|
|
||||||
//dprintf(" prepend result:\n");
|
//dprintf(" prepend result:\n");
|
||||||
|
@ -1683,9 +1696,13 @@ append_data(net_buffer* buffer, const void* data, size_t size)
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (contiguousBuffer)
|
if (contiguousBuffer) {
|
||||||
|
if (IS_USER_ADDRESS(data)) {
|
||||||
|
if (user_memcpy(contiguousBuffer, data, size) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
|
} else
|
||||||
memcpy(contiguousBuffer, data, size);
|
memcpy(contiguousBuffer, data, size);
|
||||||
else
|
} else
|
||||||
write_data(buffer, used, data, size);
|
write_data(buffer, used, data, size);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
Loading…
Reference in New Issue