mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-09 22:28:38 +01:00
LAN only filtering now properly handles mapped ipv4.
This commit is contained in:
parent
0a80b60b6c
commit
0082242a6f
1 changed files with 26 additions and 14 deletions
34
dll/base.cpp
34
dll/base.cpp
|
@ -563,15 +563,9 @@ static bool is_whitelist_ip(unsigned char *ip)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_lan_ip(const sockaddr *addr, int namelen)
|
static bool is_lan_ipv4(unsigned char *ip)
|
||||||
{
|
{
|
||||||
if (!namelen) return false;
|
PRINT_DEBUG("CHECK LAN IP %hhu.%hhu.%hhu.%hhu\n", ip[0], ip[1], ip[2], ip[3]);
|
||||||
|
|
||||||
if (addr->sa_family == AF_INET) {
|
|
||||||
struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
|
|
||||||
unsigned char ip[4];
|
|
||||||
memcpy(ip, &addr_in->sin_addr, sizeof(ip));
|
|
||||||
PRINT_DEBUG("CHECK LAN IP %hhu.%hhu.%hhu.%hhu:%u\n", ip[0], ip[1], ip[2], ip[3], ntohs(addr_in->sin_port));
|
|
||||||
if (is_whitelist_ip(ip)) return true;
|
if (is_whitelist_ip(ip)) return true;
|
||||||
if (ip[0] == 127) return true;
|
if (ip[0] == 127) return true;
|
||||||
if (ip[0] == 10) return true;
|
if (ip[0] == 10) return true;
|
||||||
|
@ -582,13 +576,25 @@ static bool is_lan_ip(const sockaddr *addr, int namelen)
|
||||||
if (ip[0] == 239) return true; //multicast
|
if (ip[0] == 239) return true; //multicast
|
||||||
if (ip[0] == 0) return true; //Current network
|
if (ip[0] == 0) return true; //Current network
|
||||||
if (ip[0] == 192 && (ip[1] == 18 || ip[1] == 19)) return true; //Used for benchmark testing of inter-network communications between two separate subnets.
|
if (ip[0] == 192 && (ip[1] == 18 || ip[1] == 19)) return true; //Used for benchmark testing of inter-network communications between two separate subnets.
|
||||||
if (ip[0] >= 224) return true; //ip multicast (224 - 239) future use (240.0.0.0–255.255.255.254) broadcast (255.255.255.255)
|
if (ip[0] >= 224) return true; //ip multicast (224 - 239) future use (240.0.0.0 - 255.255.255.254) broadcast (255.255.255.255)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_lan_ip(const sockaddr *addr, int namelen)
|
||||||
|
{
|
||||||
|
if (!namelen) return false;
|
||||||
|
|
||||||
|
if (addr->sa_family == AF_INET) {
|
||||||
|
struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
|
||||||
|
unsigned char ip[4];
|
||||||
|
memcpy(ip, &addr_in->sin_addr, sizeof(ip));
|
||||||
|
if (is_lan_ipv4(ip)) return true;
|
||||||
} else if (addr->sa_family == AF_INET6) {
|
} else if (addr->sa_family == AF_INET6) {
|
||||||
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr;
|
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr;
|
||||||
unsigned char ip[16];
|
unsigned char ip[16];
|
||||||
unsigned char zeroes[16] = {};
|
unsigned char zeroes[16] = {};
|
||||||
memcpy(ip, &addr_in6->sin6_addr, sizeof(ip));
|
memcpy(ip, &addr_in6->sin6_addr, sizeof(ip));
|
||||||
PRINT_DEBUG("CHECK LAN IP6 %hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu...%hhu\n", ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7], ip[15]);
|
PRINT_DEBUG("CHECK LAN IP6 %hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu\n", ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7], ip[8], ip[9], ip[10], ip[11], ip[12], ip[13], ip[14], ip[15]);
|
||||||
if (((ip[0] == 0xFF) && (ip[1] < 3) && (ip[15] == 1)) ||
|
if (((ip[0] == 0xFF) && (ip[1] < 3) && (ip[15] == 1)) ||
|
||||||
((ip[0] == 0xFE) && ((ip[1] & 0xC0) == 0x80))) return true;
|
((ip[0] == 0xFE) && ((ip[1] & 0xC0) == 0x80))) return true;
|
||||||
if (memcmp(zeroes, ip, sizeof(ip)) == 0) return true;
|
if (memcmp(zeroes, ip, sizeof(ip)) == 0) return true;
|
||||||
|
@ -596,7 +602,13 @@ static bool is_lan_ip(const sockaddr *addr, int namelen)
|
||||||
if (ip[0] == 0xff) return true; //multicast
|
if (ip[0] == 0xff) return true; //multicast
|
||||||
if (ip[0] == 0xfc) return true; //unique local
|
if (ip[0] == 0xfc) return true; //unique local
|
||||||
if (ip[0] == 0xfd) return true; //unique local
|
if (ip[0] == 0xfd) return true; //unique local
|
||||||
//TODO: ipv4 mapped?
|
|
||||||
|
unsigned char ipv4_mapped[12] = {};
|
||||||
|
ipv4_mapped[10] = 0xFF;
|
||||||
|
ipv4_mapped[11] = 0xFF;
|
||||||
|
if (memcmp(ipv4_mapped, ip, sizeof(ipv4_mapped)) == 0) {
|
||||||
|
if (is_lan_ipv4(ip + 12)) return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINT_DEBUG("NOT LAN IP\n");
|
PRINT_DEBUG("NOT LAN IP\n");
|
||||||
|
|
Loading…
Reference in a new issue