diff --git a/src/kits/package/hpkg/DataReader.cpp b/src/kits/package/hpkg/DataReader.cpp index 664236c6d8..f6e4984f4b 100644 --- a/src/kits/package/hpkg/DataReader.cpp +++ b/src/kits/package/hpkg/DataReader.cpp @@ -10,6 +10,10 @@ #include +#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) +#include +#endif + namespace BPackageKit { @@ -63,6 +67,12 @@ BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size) if (size > fSize || offset > (off_t)fSize - (off_t)size) return B_ERROR; +#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) + if (IS_USER_ADDRESS(buffer)) { + if (user_memcpy(buffer, (const uint8*)fData + offset, size) != B_OK) + return B_BAD_ADDRESS; + } else +#endif memcpy(buffer, (const uint8*)fData + offset, size); return B_OK; } diff --git a/src/kits/support/DataIO.cpp b/src/kits/support/DataIO.cpp index 57a5796f35..f9e1121fc0 100644 --- a/src/kits/support/DataIO.cpp +++ b/src/kits/support/DataIO.cpp @@ -15,6 +15,10 @@ #include +#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) +#include +#endif + BDataIO::BDataIO() { @@ -366,6 +370,12 @@ BMemoryIO::WriteAt(off_t pos, const void* buffer, size_t size) ssize_t sizeWritten = 0; if (pos < (off_t)fBufferSize) { sizeWritten = min_c((off_t)size, (off_t)fBufferSize - pos); +#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) + if (IS_USER_ADDRESS(fBuffer)) { + if (user_memcpy(fBuffer + pos, buffer, sizeWritten) != B_OK) + return B_BAD_ADDRESS; + } else +#endif memcpy(fBuffer + pos, buffer, sizeWritten); }