diff options
author | Panagiotis Vasilopoulos <hello@alwayslivid.com> | 2020-08-13 00:57:43 +0300 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-13 19:02:47 +0200 |
commit | dcfc54d767bcb2b7a9376cda3fa0fccd1aaf1626 (patch) | |
tree | 47171c06a6bb8abdc2f480a48e1e33e809e9e63b | |
parent | 138595961baac929df280264f3bdb729a6be33fa (diff) | |
download | serenity-dcfc54d767bcb2b7a9376cda3fa0fccd1aaf1626.zip |
AK: Add initial support for obscure IPv4 address notations
This change aims to add support for obscure IPv4 address notations, such as 1.1 (which should be equal to 1.0.0.1), or the hypothetical address 1 (which is equal to 0.0.0.1). This is supported on other platforms as well, such as Linux, Windows, *BSD, and even Haiku.
-rw-r--r-- | AK/IPv4Address.h | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/AK/IPv4Address.h b/AK/IPv4Address.h index 810c9013a4..733987c9f3 100644 --- a/AK/IPv4Address.h +++ b/AK/IPv4Address.h @@ -40,7 +40,7 @@ namespace AK { class [[gnu::packed]] IPv4Address { public: - IPv4Address() {} + IPv4Address() { } IPv4Address(const u8 data[4]) { m_data[0] = data[0]; @@ -76,12 +76,37 @@ public: if (string.is_null()) return {}; auto parts = string.split_view('.'); - if (parts.size() != 4) + + u32 a; + u32 b; + u32 c; + u32 d; + + if (parts.size() == 1) { + a = 0; + b = 0; + c = 0; + d = parts[1].to_uint().value_or(256); + } else if (parts.size() == 2) { + a = parts[1].to_uint().value_or(256); + b = 0; + c = 0; + d = parts[2].to_uint().value_or(256); + } else if (parts.size() == 3) { + a = parts[0].to_uint().value_or(256); + b = parts[1].to_uint().value_or(256); + c = 0; + d = parts[2].to_uint().value_or(256); + } else if (parts.size() == 4) { + a = parts[0].to_uint().value_or(256); + b = parts[1].to_uint().value_or(256); + c = parts[2].to_uint().value_or(256); + d = parts[3].to_uint().value_or(256); + } else { return {}; - auto a = parts[0].to_uint().value_or(256); - auto b = parts[1].to_uint().value_or(256); - auto c = parts[2].to_uint().value_or(256); - auto d = parts[3].to_uint().value_or(256); + } + + if (a > 255 || b > 255 || c > 255 || d > 255) return {}; return IPv4Address((u8)a, (u8)b, (u8)c, (u8)d); |