From d864e0c6281024ce4b9bd654aa83308a50f583d8 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 23 Aug 2025 18:26:02 +0200 Subject: feat: Network: Fix IPv4 `IpCheckVersion4` parser. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/Network/IPAddr.cc | 110 ----------------------------- dev/kernel/src/Network/IPAddress.cc | 113 ++++++++++++++++++++++++++++++ dev/kernel/src/Network/IPCAddr.cc | 27 -------- dev/kernel/src/Network/IPCAddress.cc | 27 ++++++++ dev/kernel/src/Network/IPCMessage.cc | 129 +++++++++++++++++++++++++++++++++++ dev/kernel/src/Network/IPCMsg.cc | 127 ---------------------------------- 6 files changed, 269 insertions(+), 264 deletions(-) delete mode 100644 dev/kernel/src/Network/IPAddr.cc create mode 100644 dev/kernel/src/Network/IPAddress.cc delete mode 100644 dev/kernel/src/Network/IPCAddr.cc create mode 100644 dev/kernel/src/Network/IPCAddress.cc create mode 100644 dev/kernel/src/Network/IPCMessage.cc delete mode 100644 dev/kernel/src/Network/IPCMsg.cc (limited to 'dev/kernel/src') diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc deleted file mode 100644 index ec7d8a35..00000000 --- a/dev/kernel/src/Network/IPAddr.cc +++ /dev/null @@ -1,110 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include - -namespace Kernel { -UInt8* RawIPAddress::Address() { - return fAddr; -} - -RawIPAddress::RawIPAddress(UInt8 bytes[4]) { - rt_copy_memory(bytes, fAddr, 4); -} - -BOOL RawIPAddress::operator==(const RawIPAddress& ipv4) { - for (Size index = 0; index < 4; ++index) { - if (ipv4.fAddr[index] != fAddr[index]) return false; - } - - return true; -} - -BOOL RawIPAddress::operator!=(const RawIPAddress& ipv4) { - for (Size index = 0; index < 4; ++index) { - if (ipv4.fAddr[index] == fAddr[index]) return false; - } - - return true; -} - -UInt8& RawIPAddress::operator[](const Size& index) { - kout << "[RawIPAddress::operator[]] Fetching Index...\r"; - - static UInt8 IP_PLACEHOLDER = '0'; - if (index >= 4) return IP_PLACEHOLDER; - - return fAddr[index]; -} - -RawIPAddress6::RawIPAddress6(UInt8 bytes[16]) { - rt_copy_memory(bytes, fAddr, 16); -} - -UInt8& RawIPAddress6::operator[](const Size& index) { - kout << "[RawIPAddress6::operator[]] Fetching Index...\r"; - - static UInt8 IP_PLACEHOLDER = '0'; - if (index >= 16) return IP_PLACEHOLDER; - - return fAddr[index]; -} - -bool RawIPAddress6::operator==(const RawIPAddress6& ipv6) { - for (SizeT index = 0; index < 16; ++index) { - if (ipv6.fAddr[index] != fAddr[index]) return false; - } - - return true; -} - -bool RawIPAddress6::operator!=(const RawIPAddress6& ipv6) { - for (SizeT index = 0; index < 16; ++index) { - if (ipv6.fAddr[index] == fAddr[index]) return false; - } - - return true; -} - -/// @todo -ErrorOr IPFactory::ToKString(Ref& ipv6) { - NE_UNUSED(ipv6); - auto str = KStringBuilder::Construct(0); - return str; -} - -/// @todo -ErrorOr IPFactory::ToKString(Ref& ipv4) { - NE_UNUSED(ipv4); - auto str = KStringBuilder::Construct(0); - return str; -} - -/// @note Doesn't catch IPs such as 256.999.0.1, UNSAFE! -bool IPFactory::IpCheckVersion4(const Char* ip) { - if (!ip) return NO; - - Int32 cnter = 0; - Int32 dot_cnter = 0; - - for (SizeT base = 0; base < rt_string_len(ip); ++base) { - if (ip[base] == '.') { - cnter = 0; - ++dot_cnter; - } else { - if (!rt_is_alnum(ip[base])) return NO; - if (cnter == 3) return NO; - - ++cnter; - } - } - - if (dot_cnter != 3) return NO; - - return YES; -} -} // namespace Kernel diff --git a/dev/kernel/src/Network/IPAddress.cc b/dev/kernel/src/Network/IPAddress.cc new file mode 100644 index 00000000..b02eae08 --- /dev/null +++ b/dev/kernel/src/Network/IPAddress.cc @@ -0,0 +1,113 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include + +namespace Kernel { +UInt8* RawIPAddress::Address() { + return fAddr; +} + +RawIPAddress::RawIPAddress(UInt8 bytes[4]) { + rt_copy_memory(bytes, fAddr, 4); +} + +BOOL RawIPAddress::operator==(const RawIPAddress& ipv4) { + for (Size index = 0; index < 4; ++index) { + if (ipv4.fAddr[index] != fAddr[index]) return false; + } + + return true; +} + +BOOL RawIPAddress::operator!=(const RawIPAddress& ipv4) { + for (Size index = 0; index < 4; ++index) { + if (ipv4.fAddr[index] == fAddr[index]) return false; + } + + return true; +} + +UInt8& RawIPAddress::operator[](const Size& index) { + kout << "[RawIPAddress::operator[]] Fetching Index...\r"; + + static UInt8 IP_PLACEHOLDER = '0'; + if (index >= 4) return IP_PLACEHOLDER; + + return fAddr[index]; +} + +RawIPAddress6::RawIPAddress6(UInt8 bytes[16]) { + rt_copy_memory(bytes, fAddr, 16); +} + +UInt8& RawIPAddress6::operator[](const Size& index) { + kout << "[RawIPAddress6::operator[]] Fetching Index...\r"; + + static UInt8 IP_PLACEHOLDER = '0'; + if (index >= 16) return IP_PLACEHOLDER; + + return fAddr[index]; +} + +bool RawIPAddress6::operator==(const RawIPAddress6& ipv6) { + for (SizeT index = 0; index < 16; ++index) { + if (ipv6.fAddr[index] != fAddr[index]) return false; + } + + return true; +} + +bool RawIPAddress6::operator!=(const RawIPAddress6& ipv6) { + for (SizeT index = 0; index < 16; ++index) { + if (ipv6.fAddr[index] == fAddr[index]) return false; + } + + return true; +} + +/// @todo +ErrorOr IPFactory::ToKString(Ref& ipv6) { + NE_UNUSED(ipv6); + auto str = KStringBuilder::Construct(0); + return str; +} + +/// @todo +ErrorOr IPFactory::ToKString(Ref& ipv4) { + NE_UNUSED(ipv4); + auto str = KStringBuilder::Construct(0); + return str; +} + +/// @note Doesn't catch IPs such as 256.999.0.1, UNSAFE! +bool IPFactory::IpCheckVersion4(const Char* ip) { + if (!ip) return NO; + + Int32 cnter = 0; + Int32 dot_cnter = 0; + + constexpr const auto kIP4DotCharacter = '.'; + + for (SizeT base = 0; base < rt_string_len(ip); ++base) { + if (ip[base] == kIP4DotCharacter) { + cnter = 0; + ++dot_cnter; + } else { + if (ip[base] > '5' || ip[base] < '0') return NO; + if (!rt_is_alnum(ip[base])) return NO; + if (cnter == 3) return NO; + + ++cnter; + } + } + + if (dot_cnter != 3) return NO; + + return YES; +} +} // namespace Kernel diff --git a/dev/kernel/src/Network/IPCAddr.cc b/dev/kernel/src/Network/IPCAddr.cc deleted file mode 100644 index 4c1dd500..00000000 --- a/dev/kernel/src/Network/IPCAddr.cc +++ /dev/null @@ -1,27 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - - ------------------------------------------- */ - -#include -#include -#include - -namespace Kernel { -bool IPC_ADDR::operator==(const IPC_ADDR& addr) noexcept { - return addr.UserProcessID == this->UserProcessID && addr.UserProcessTeam == this->UserProcessTeam; -} - -bool IPC_ADDR::operator==(IPC_ADDR& addr) noexcept { - return addr.UserProcessID == this->UserProcessID && addr.UserProcessTeam == this->UserProcessTeam; -} - -bool IPC_ADDR::operator!=(const IPC_ADDR& addr) noexcept { - return addr.UserProcessID != this->UserProcessID || addr.UserProcessTeam != this->UserProcessTeam; -} - -bool IPC_ADDR::operator!=(IPC_ADDR& addr) noexcept { - return addr.UserProcessID != this->UserProcessID || addr.UserProcessTeam != this->UserProcessTeam; -} -} // namespace Kernel diff --git a/dev/kernel/src/Network/IPCAddress.cc b/dev/kernel/src/Network/IPCAddress.cc new file mode 100644 index 00000000..4c1dd500 --- /dev/null +++ b/dev/kernel/src/Network/IPCAddress.cc @@ -0,0 +1,27 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + + ------------------------------------------- */ + +#include +#include +#include + +namespace Kernel { +bool IPC_ADDR::operator==(const IPC_ADDR& addr) noexcept { + return addr.UserProcessID == this->UserProcessID && addr.UserProcessTeam == this->UserProcessTeam; +} + +bool IPC_ADDR::operator==(IPC_ADDR& addr) noexcept { + return addr.UserProcessID == this->UserProcessID && addr.UserProcessTeam == this->UserProcessTeam; +} + +bool IPC_ADDR::operator!=(const IPC_ADDR& addr) noexcept { + return addr.UserProcessID != this->UserProcessID || addr.UserProcessTeam != this->UserProcessTeam; +} + +bool IPC_ADDR::operator!=(IPC_ADDR& addr) noexcept { + return addr.UserProcessID != this->UserProcessID || addr.UserProcessTeam != this->UserProcessTeam; +} +} // namespace Kernel diff --git a/dev/kernel/src/Network/IPCMessage.cc b/dev/kernel/src/Network/IPCMessage.cc new file mode 100644 index 00000000..6f8223f7 --- /dev/null +++ b/dev/kernel/src/Network/IPCMessage.cc @@ -0,0 +1,129 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include +#include + +namespace Kernel { +/***********************************************************************************/ +/// @internal internal use for IPC system only. +/// @brief The internal sanitize function. +/***********************************************************************************/ +Bool ipc_int_sanitize_packet(IPC_MSG* pckt) { + auto endian = RTL_ENDIAN(pckt, ((Char*) pckt)[0]); + + switch (endian) { + case Endian::kEndianBig: { + if (pckt->IpcEndianess == kIPCLittleEndian) goto ipc_check_failed; + + break; + } + case Endian::kEndianLittle: { + if (pckt->IpcEndianess == kIPCBigEndian) goto ipc_check_failed; + + break; + } + case Endian::kEndianMixed: { + if (pckt->IpcEndianess == kIPCMixedEndian) goto ipc_check_failed; + + break; + } + default: + goto ipc_check_failed; + } + + if (pckt->IpcFrom == pckt->IpcTo || pckt->IpcPacketSize > kIPCMsgSize) { + goto ipc_check_failed; + } + + return pckt->IpcPacketSize > 1 && pckt->IpcHeaderMagic == kIPCHeaderMagic; + +ipc_check_failed: + err_local_get() = kErrorIPC; + return false; +} + +/***********************************************************************************/ +/// @brief Sanitize packet function +/// @retval true packet is correct. +/// @retval false packet is incorrect and process has crashed. +/***********************************************************************************/ +Bool ipc_sanitize_packet(IPC_MSG* pckt) { + if (!pckt || !ipc_int_sanitize_packet(pckt)) { + return false; + } + + return true; +} + +/***********************************************************************************/ +/// @brief Construct packet function +/// @retval true packet is correct. +/// @retval false packet is incorrect and process has crashed. +/***********************************************************************************/ +Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) { + // don't act if it's not even valid. + if (!pckt_in) return false; + + if (!*pckt_in) *pckt_in = new IPC_MSG(); + + MUST_PASS(*pckt_in); + + if (*pckt_in) { + const auto endianess = RTL_ENDIAN((*pckt_in), ((Char*) (*pckt_in))[0]); + + (*pckt_in)->IpcHeaderMagic = kIPCHeaderMagic; + + (*pckt_in)->IpcEndianess = static_cast(endianess); + (*pckt_in)->IpcPacketSize = sizeof(IPC_MSG); + + (*pckt_in)->IpcTo.UserProcessID = 0; + (*pckt_in)->IpcTo.UserProcessTeam = 0; + + (*pckt_in)->IpcFrom.UserProcessID = 0; + (*pckt_in)->IpcFrom.UserProcessTeam = 0; + + (*pckt_in)->IpcLock = kIPCLockFree; + + return Yes; + } + + return No; +} + +/***********************************************************************************/ +/// @brief Pass message from **src** to **target** +/// @param src Source message. +/// @param target Target message. +/***********************************************************************************/ +Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept { + if (src && target && (target != src)) { + if (src->IpcMsgSz > target->IpcMsgSz) return No; + if (target->IpcMsgSz > src->IpcMsgSz) return No; + + auto timeout = 0U; + + const auto kLimitTimeout = 1000000U; + + while ((target->IpcLock % kIPCLockUsed) != 0) { + if (timeout > kLimitTimeout) { + return No; + } + } + + ++target->IpcLock; + + rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize); + + --target->IpcLock; + + return Yes; + } + + return No; +} +} // namespace Kernel diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc deleted file mode 100644 index 9abefcef..00000000 --- a/dev/kernel/src/Network/IPCMsg.cc +++ /dev/null @@ -1,127 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include -#include - -namespace Kernel { -/***********************************************************************************/ -/// @internal internal use for IPC system only. -/// @brief The internal sanitize function. -/***********************************************************************************/ -Bool ipc_int_sanitize_packet(IPC_MSG* pckt) { - auto endian = RTL_ENDIAN(pckt, ((Char*) pckt)[0]); - - switch (endian) { - case Endian::kEndianBig: { - if (pckt->IpcEndianess == kIPCLittleEndian) goto ipc_check_failed; - - break; - } - case Endian::kEndianLittle: { - if (pckt->IpcEndianess == kIPCBigEndian) goto ipc_check_failed; - - break; - } - case Endian::kEndianMixed: { - if (pckt->IpcEndianess == kIPCMixedEndian) goto ipc_check_failed; - - break; - } - default: - goto ipc_check_failed; - } - - if (pckt->IpcFrom == pckt->IpcTo || pckt->IpcPacketSize > kIPCMsgSize) { - goto ipc_check_failed; - } - - return pckt->IpcPacketSize > 1 && pckt->IpcHeaderMagic == kIPCHeaderMagic; - -ipc_check_failed: - err_local_get() = kErrorIPC; - return false; -} - -/***********************************************************************************/ -/// @brief Sanitize packet function -/// @retval true packet is correct. -/// @retval false packet is incorrect and process has crashed. -/***********************************************************************************/ -Bool ipc_sanitize_packet(IPC_MSG* pckt) { - if (!pckt || !ipc_int_sanitize_packet(pckt)) { - return false; - } - - return true; -} - -/***********************************************************************************/ -/// @brief Construct packet function -/// @retval true packet is correct. -/// @retval false packet is incorrect and process has crashed. -/***********************************************************************************/ -Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) { - // don't act if it's not even valid. - if (!pckt_in) return false; - - if (!*pckt_in) *pckt_in = new IPC_MSG(); - - MUST_PASS(*pckt_in); - - if (*pckt_in) { - const auto endianess = RTL_ENDIAN((*pckt_in), ((Char*) (*pckt_in))[0]); - - (*pckt_in)->IpcHeaderMagic = kIPCHeaderMagic; - - (*pckt_in)->IpcEndianess = static_cast(endianess); - (*pckt_in)->IpcPacketSize = sizeof(IPC_MSG); - - (*pckt_in)->IpcTo.UserProcessID = 0; - (*pckt_in)->IpcTo.UserProcessTeam = 0; - - (*pckt_in)->IpcFrom.UserProcessID = 0; - (*pckt_in)->IpcFrom.UserProcessTeam = 0; - - (*pckt_in)->IpcLock = kIPCLockFree; - - return Yes; - } - - return No; -} - -/***********************************************************************************/ -/// @brief Pass message from **src** to **target** -/// @param src Source message. -/// @param target Target message. -/***********************************************************************************/ -Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept { - if (src && target && (target != src)) { - if (src->IpcMsgSz > target->IpcMsgSz) return No; - if (target->IpcMsgSz > src->IpcMsgSz) return No; - - UInt32 timeout = 0U; - - while ((target->IpcLock % kIPCLockUsed) != 0) { - if (timeout > 100000U) { - return No; - } - } - - ++target->IpcLock; - - rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize); - - --target->IpcLock; - - return Yes; - } - - return No; -} -} // namespace Kernel -- cgit v1.2.3