fix: various kernel bug fixes
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include <CppLib/Spinlock.hpp>
|
||||
#include <Timekeeping/ApicTimer.hpp>
|
||||
#include <Terminal/Terminal.hpp>
|
||||
#include <Api/UserMemory.hpp>
|
||||
|
||||
namespace Ipc {
|
||||
|
||||
@@ -697,6 +698,7 @@ namespace Ipc {
|
||||
|
||||
int StreamReadHandle(int handle, uint8_t* out, int maxLen) {
|
||||
if (out == nullptr) return -1;
|
||||
if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)out, (uint64_t)maxLen, true)) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
@@ -708,6 +710,7 @@ namespace Ipc {
|
||||
|
||||
int StreamWriteHandle(int handle, const uint8_t* data, int len) {
|
||||
if (data == nullptr) return -1;
|
||||
if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, (uint64_t)len, false)) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
@@ -908,6 +911,8 @@ namespace Ipc {
|
||||
}
|
||||
|
||||
int MailboxSendHandle(int handle, uint32_t msgType, const void* data, uint16_t len, int attachHandle) {
|
||||
if (len > 0 && (data == nullptr || !Montauk::UserMemory::Range((uint64_t)data, len, false))) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
uint32_t rights = 0;
|
||||
@@ -918,6 +923,13 @@ namespace Ipc {
|
||||
}
|
||||
|
||||
int MailboxRecvHandle(int handle, uint32_t* msgType, void* data, uint16_t* inOutLen, int* outAttachHandle) {
|
||||
if (inOutLen == nullptr || !Montauk::UserMemory::Writable<uint16_t>((uint64_t)inOutLen)) return -1;
|
||||
|
||||
uint16_t requestedLen = *inOutLen;
|
||||
if (msgType != nullptr && !Montauk::UserMemory::Writable<uint32_t>((uint64_t)msgType)) return -1;
|
||||
if (requestedLen > 0 && (data == nullptr || !Montauk::UserMemory::Range((uint64_t)data, requestedLen, true))) return -1;
|
||||
if (outAttachHandle != nullptr && !Montauk::UserMemory::Writable<int>((uint64_t)outAttachHandle)) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
uint32_t rights = 0;
|
||||
@@ -978,6 +990,7 @@ namespace Ipc {
|
||||
|
||||
int FileReadHandle(int handle, uint8_t* buffer, uint64_t offset, uint64_t size) {
|
||||
if (buffer == nullptr) return -1;
|
||||
if (size > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, size, true)) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
@@ -989,6 +1002,7 @@ namespace Ipc {
|
||||
|
||||
int FileWriteHandle(int handle, const uint8_t* buffer, uint64_t offset, uint64_t size) {
|
||||
if (buffer == nullptr) return -1;
|
||||
if (size > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, size, false)) return -1;
|
||||
|
||||
HandleType type = HandleType::None;
|
||||
Object* object = nullptr;
|
||||
@@ -1208,6 +1222,7 @@ namespace Ipc {
|
||||
|
||||
int SocketSendHandle(int handle, const uint8_t* data, uint32_t len) {
|
||||
if (data == nullptr) return -1;
|
||||
if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, len, false)) return -1;
|
||||
|
||||
Socket* socket = nullptr;
|
||||
uint32_t rights = 0;
|
||||
@@ -1223,6 +1238,7 @@ namespace Ipc {
|
||||
|
||||
int SocketRecvHandle(int handle, uint8_t* buffer, uint32_t maxLen) {
|
||||
if (buffer == nullptr) return -1;
|
||||
if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1;
|
||||
|
||||
Socket* socket = nullptr;
|
||||
uint32_t rights = 0;
|
||||
@@ -1241,6 +1257,7 @@ namespace Ipc {
|
||||
|
||||
int SocketSendToHandle(int handle, const uint8_t* data, uint32_t len, uint32_t destIp, uint16_t destPort) {
|
||||
if (data == nullptr) return -1;
|
||||
if (len > 0 && !Montauk::UserMemory::Range((uint64_t)data, len, false)) return -1;
|
||||
|
||||
Socket* socket = nullptr;
|
||||
uint32_t rights = 0;
|
||||
@@ -1271,6 +1288,9 @@ namespace Ipc {
|
||||
|
||||
int SocketRecvFromHandle(int handle, uint8_t* buffer, uint32_t maxLen, uint32_t* srcIp, uint16_t* srcPort) {
|
||||
if (buffer == nullptr) return -1;
|
||||
if (maxLen > 0 && !Montauk::UserMemory::Range((uint64_t)buffer, maxLen, true)) return -1;
|
||||
if (srcIp != nullptr && !Montauk::UserMemory::Writable<uint32_t>((uint64_t)srcIp)) return -1;
|
||||
if (srcPort != nullptr && !Montauk::UserMemory::Writable<uint16_t>((uint64_t)srcPort)) return -1;
|
||||
|
||||
Socket* socket = nullptr;
|
||||
uint32_t rights = 0;
|
||||
|
||||
Reference in New Issue
Block a user