aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-06-26 18:11:45 +0000
committerthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-06-26 18:11:45 +0000
commit1bfc7abd59141813afbd6d912555f221a417ad0c (patch)
tree372973c60f47149c19a4c5a14c5288e7fdda8330
parent6b933415d6c20935c98b0b3748724aa2485d82a9 (diff)
downloadioquake3-aero-1bfc7abd59141813afbd6d912555f221a417ad0c.tar.gz
ioquake3-aero-1bfc7abd59141813afbd6d912555f221a417ad0c.zip
- Add error handling for Opensolaris f***ing up a numeric getnameinfo() call.
- Fix memory leak in getaddrinfo() call Many thanks to Ben Millwood for reporting this. git-svn-id: svn://svn.icculus.org/quake3/trunk@1579 edf5b092-35ff-0310-97b2-ce42778d08ea
-rw-r--r--code/qcommon/net_ip.c53
1 files changed, 29 insertions, 24 deletions
diff --git a/code/qcommon/net_ip.c b/code/qcommon/net_ip.c
index 2cbd52b..b305249 100644
--- a/code/qcommon/net_ip.c
+++ b/code/qcommon/net_ip.c
@@ -341,7 +341,8 @@ static void Sys_SockaddrToString(char *dest, int destlen, struct sockaddr *input
else
inputlen = sizeof(struct sockaddr_in);
- getnameinfo(input, inputlen, dest, destlen, NULL, 0, NI_NUMERICHOST);
+ if(getnameinfo(input, inputlen, dest, destlen, NULL, 0, NI_NUMERICHOST) && destlen > 0)
+ *dest = '\0';
}
/*
@@ -1319,9 +1320,6 @@ void NET_GetLocalAddress( void ) {
char hostname[256];
struct addrinfo hint;
struct addrinfo *res = NULL;
- struct addrinfo *search;
- struct sockaddr_in mask4;
- struct sockaddr_in6 mask6;
if(gethostname( hostname, 256 ) == SOCKET_ERROR)
return;
@@ -1333,29 +1331,36 @@ void NET_GetLocalAddress( void ) {
hint.ai_family = AF_UNSPEC;
hint.ai_socktype = SOCK_DGRAM;
- if(getaddrinfo(hostname, NULL, &hint, &res))
- return;
-
- /* On operating systems where it's more difficult to find out the configured interfaces, we'll just assume a
- * netmask with all bits set. */
-
- memset(&mask4, 0, sizeof(mask4));
- memset(&mask6, 0, sizeof(mask6));
- mask4.sin_family = AF_INET;
- memset(&mask4.sin_addr.s_addr, 0xFF, sizeof(mask4.sin_addr.s_addr));
- mask6.sin6_family = AF_INET6;
- memset(&mask6.sin6_addr, 0xFF, sizeof(mask6.sin6_addr));
-
- // add all IPs from returned list.
- for(search = res; search; search = search->ai_next)
+ if(!getaddrinfo(hostname, NULL, &hint, &res))
{
- if(search->ai_family == AF_INET)
- NET_AddLocalAddress("", search->ai_addr, (struct sockaddr *) &mask4);
- else if(search->ai_family == AF_INET6)
- NET_AddLocalAddress("", search->ai_addr, (struct sockaddr *) &mask6);
+ struct sockaddr_in mask4;
+ struct sockaddr_in6 mask6;
+ struct addrinfo *search;
+
+ /* On operating systems where it's more difficult to find out the configured interfaces, we'll just assume a
+ * netmask with all bits set. */
+
+ memset(&mask4, 0, sizeof(mask4));
+ memset(&mask6, 0, sizeof(mask6));
+ mask4.sin_family = AF_INET;
+ memset(&mask4.sin_addr.s_addr, 0xFF, sizeof(mask4.sin_addr.s_addr));
+ mask6.sin6_family = AF_INET6;
+ memset(&mask6.sin6_addr, 0xFF, sizeof(mask6.sin6_addr));
+
+ // add all IPs from returned list.
+ for(search = res; search; search = search->ai_next)
+ {
+ if(search->ai_family == AF_INET)
+ NET_AddLocalAddress("", search->ai_addr, (struct sockaddr *) &mask4);
+ else if(search->ai_family == AF_INET6)
+ NET_AddLocalAddress("", search->ai_addr, (struct sockaddr *) &mask6);
+ }
+
+ Sys_ShowIP();
}
- Sys_ShowIP();
+ if(res)
+ freeaddrinfo(res);
}
#endif