Skip to content

Commit d84d200

Browse files
authored
Merge pull request #3443 from A13501350/v2/master
fix(iis): IPv6 Handling in ModSecurity IIS Module
2 parents f3f00e3 + 02d0805 commit d84d200

File tree

1 file changed

+51
-48
lines changed

1 file changed

+51
-48
lines changed

iis/mymodule.cpp

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -90,63 +90,66 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
9090

9191
char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr)
9292
{
93-
const char *format = "%15[0-9.]:%5[0-9]";
94-
char ip[16] = { 0 }; // ip4 addresses have max len 15
95-
char port[6] = { 0 }; // port numbers are 16bit, ie 5 digits max
96-
97-
DWORD len = 50;
98-
char *buf = (char *)apr_palloc(pool, len);
99-
100-
if(buf == NULL)
101-
return "";
102-
103-
buf[0] = 0;
104-
105-
WSAAddressToString(pAddr, sizeof(SOCKADDR), NULL, buf, &len);
106-
107-
// test for IPV4 with port on the end
108-
if (sscanf(buf, format, ip, port) == 2) {
109-
// IPV4 but with port - remove the port
110-
char* input = ":";
111-
char* ipv4 = strtok(buf, input);
112-
return ipv4;
113-
}
114-
115-
return buf;
93+
if (pAddr == nullptr) {
94+
return apr_pstrdup(pool, "");
95+
}
96+
97+
DWORD addrSize = pAddr->sa_family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6);
98+
auto buf = (char*)apr_palloc(pool, NI_MAXHOST);
99+
if (buf == nullptr) {
100+
return apr_pstrdup(pool, "");
101+
}
102+
buf[0] = '\0';
103+
104+
if (GetNameInfo(pAddr, addrSize, buf, NI_MAXHOST, nullptr, 0, NI_NUMERICHOST) != 0) {
105+
return apr_pstrdup(pool, "");
106+
}
107+
108+
return buf;
116109
}
117110

118111
apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr)
119112
{
120-
apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t));
121-
int adrlen = 16, iplen = 4;
113+
apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t));
122114

123-
if(pAddr->sa_family == AF_INET6)
124-
{
125-
adrlen = 46;
126-
iplen = 16;
115+
addr->pool = pool;
116+
addr->hostname = "unknown";
117+
addr->servname = addr->hostname;
118+
addr->family = AF_UNSPEC;
119+
addr->addr_str_len = 0;
120+
addr->ipaddr_len = 0;
121+
addr->ipaddr_ptr = nullptr;
122+
addr->salen = 0;
123+
addr->port = 0;
124+
125+
if (pAddr == nullptr) {
126+
return addr;
127127
}
128128

129-
addr->addr_str_len = adrlen;
130129
addr->family = pAddr->sa_family;
131130

132-
addr->hostname = "unknown";
133-
#ifdef WIN32
134-
addr->ipaddr_len = sizeof(IN_ADDR);
135-
#else
136-
addr->ipaddr_len = sizeof(struct in_addr);
137-
#endif
138-
addr->ipaddr_ptr = &addr->sa.sin.sin_addr;
139-
addr->pool = pool;
140-
addr->port = 80;
141-
#ifdef WIN32
142-
memcpy(&addr->sa.sin.sin_addr.S_un.S_addr, pAddr->sa_data, iplen);
143-
#else
144-
memcpy(&addr->sa.sin.sin_addr.s_addr, pAddr->sa_data, iplen);
145-
#endif
146-
addr->sa.sin.sin_family = pAddr->sa_family;
147-
addr->sa.sin.sin_port = 80;
148-
addr->salen = sizeof(addr->sa);
149-
addr->servname = addr->hostname;
131+
if (pAddr->sa_family == AF_INET) {
132+
auto sin = (SOCKADDR_IN *)pAddr;
133+
addr->addr_str_len = INET_ADDRSTRLEN;
134+
addr->ipaddr_len = sizeof(struct in_addr);
135+
addr->ipaddr_ptr = &addr->sa.sin.sin_addr;
136+
addr->sa.sin.sin_family = AF_INET;
137+
addr->sa.sin.sin_port = sin->sin_port; /* keep network byte order */
138+
/* copy address */
139+
memcpy(&addr->sa.sin.sin_addr, &sin->sin_addr, sizeof(struct in_addr));
140+
addr->salen = sizeof(addr->sa);
141+
addr->port = ntohs(sin->sin_port);
142+
} else if (pAddr->sa_family == AF_INET6) {
143+
auto sin6 = (SOCKADDR_IN6 *)pAddr;
144+
addr->addr_str_len = INET6_ADDRSTRLEN;
145+
addr->ipaddr_len = sizeof(struct in6_addr);
146+
addr->ipaddr_ptr = &addr->sa.sin6.sin6_addr;
147+
addr->sa.sin6.sin6_family = AF_INET6;
148+
addr->sa.sin6.sin6_port = sin6->sin6_port;
149+
memcpy(&addr->sa.sin6.sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
150+
addr->salen = sizeof(addr->sa);
151+
addr->port = ntohs(sin6->sin6_port);
152+
}
150153

151154
return addr;
152155
}

0 commit comments

Comments
 (0)