Merge 97464778b92bc7904ff793dd0ccea338cc24194c into f3f00e348b65e94c033960513950d7fc375b10df

This commit is contained in:
A13501350 2025-09-24 11:20:01 +00:00 committed by GitHub
commit 33c2b45bcb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -90,63 +90,66 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr) char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr)
{ {
const char *format = "%15[0-9.]:%5[0-9]"; if (pAddr == NULL) {
char ip[16] = { 0 }; // ip4 addresses have max len 15
char port[6] = { 0 }; // port numbers are 16bit, ie 5 digits max
DWORD len = 50;
char *buf = (char *)apr_palloc(pool, len);
if(buf == NULL)
return ""; return "";
buf[0] = 0;
WSAAddressToString(pAddr, sizeof(SOCKADDR), NULL, buf, &len);
// test for IPV4 with port on the end
if (sscanf(buf, format, ip, port) == 2) {
// IPV4 but with port - remove the port
char* input = ":";
char* ipv4 = strtok(buf, input);
return ipv4;
} }
DWORD addrSize = pAddr->sa_family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6);
char* buf = (char*)apr_palloc(pool, NI_MAXHOST);
if (buf == NULL) {
return "";
}
buf[0] = '\0';
if (GetNameInfo(pAddr, addrSize, buf, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) != 0) {
return "";
}
return buf; return buf;
} }
apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr) apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr)
{ {
apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t)); apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t));
int adrlen = 16, iplen = 4;
if(pAddr->sa_family == AF_INET6) addr->pool = pool;
{ addr->hostname = "unknown";
adrlen = 46; addr->servname = addr->hostname;
iplen = 16; addr->family = AF_UNSPEC;
addr->addr_str_len = 0;
addr->ipaddr_len = 0;
addr->ipaddr_ptr = NULL;
addr->salen = 0;
addr->port = 0;
if (pAddr == NULL) {
return addr;
} }
addr->addr_str_len = adrlen;
addr->family = pAddr->sa_family; addr->family = pAddr->sa_family;
addr->hostname = "unknown"; if (pAddr->sa_family == AF_INET) {
#ifdef WIN32 SOCKADDR_IN *sin = (SOCKADDR_IN *)pAddr;
addr->ipaddr_len = sizeof(IN_ADDR); addr->addr_str_len = INET_ADDRSTRLEN;
#else addr->ipaddr_len = sizeof(struct in_addr);
addr->ipaddr_len = sizeof(struct in_addr); addr->ipaddr_ptr = &addr->sa.sin.sin_addr;
#endif addr->sa.sin.sin_family = AF_INET;
addr->ipaddr_ptr = &addr->sa.sin.sin_addr; addr->sa.sin.sin_port = sin->sin_port; /* keep network byte order */
addr->pool = pool; /* copy address */
addr->port = 80; memcpy(&addr->sa.sin.sin_addr, &sin->sin_addr, sizeof(struct in_addr));
#ifdef WIN32 addr->salen = sizeof(addr->sa);
memcpy(&addr->sa.sin.sin_addr.S_un.S_addr, pAddr->sa_data, iplen); addr->port = ntohs(sin->sin_port);
#else } else if (pAddr->sa_family == AF_INET6) {
memcpy(&addr->sa.sin.sin_addr.s_addr, pAddr->sa_data, iplen); SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)pAddr;
#endif addr->addr_str_len = INET6_ADDRSTRLEN;
addr->sa.sin.sin_family = pAddr->sa_family; addr->ipaddr_len = sizeof(struct in6_addr);
addr->sa.sin.sin_port = 80; addr->ipaddr_ptr = &addr->sa.sin6.sin6_addr;
addr->salen = sizeof(addr->sa); addr->sa.sin6.sin6_family = AF_INET6;
addr->servname = addr->hostname; addr->sa.sin6.sin6_port = sin6->sin6_port;
memcpy(&addr->sa.sin6.sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
addr->salen = sizeof(addr->sa);
addr->port = ntohs(sin6->sin6_port);
}
return addr; return addr;
} }