]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - lhnet.c
Cryptographic authentication support for the d0_blind_id library available on http...
[xonotic/darkplaces.git] / lhnet.c
diff --git a/lhnet.c b/lhnet.c
index cd60917f611d3293389b90d4b78e0ae237d4b2a0..42ca242cf0c1a91b08d04f9befd67266b66b8f99 100644 (file)
--- a/lhnet.c
+++ b/lhnet.c
@@ -1,17 +1,17 @@
 
 // Written by Forest Hale 2003-06-15 and placed into public domain.
 
-#ifdef SUPPORTIPV6
 #ifdef WIN32
+# ifdef SUPPORTIPV6
 // Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions
 # define _WIN32_WINNT 0x0501
+# endif
 # include <winsock2.h>
 # include <ws2tcpip.h>
 # ifdef USE_WSPIAPI_H
 #  include <wspiapi.h>
 # endif
 #endif
-#endif
 
 #ifndef STANDALONETEST
 #include "quakedef.h"
 #include <stdio.h>
 #include <time.h>
 #include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
+#ifndef WIN32
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -124,7 +121,7 @@ int LHNETADDRESS_FromPort(lhnetaddress_t *vaddress, lhnetaddresstype_t addressty
        switch(addresstype)
        {
        default:
-               return 0;
+               break;
        case LHNETADDRESSTYPE_LOOP:
                // local:port  (loopback)
                memset(address, 0, sizeof(*address));
@@ -389,8 +386,12 @@ int LHNETADDRESS_FromString(lhnetaddress_t *vaddress, const char *string, int de
        address->addresstype = LHNETADDRESSTYPE_NONE;
        port = 0;
        colon = strrchr(string, ':');
-       if (colon)
+       if (colon && (colon == strchr(string, ':') || (string[0] == '[' && colon - string > 0 && colon[-1] == ']')))
+       //           EITHER: colon is the ONLY colon  OR: colon comes after [...] delimited IPv6 address
+       //           fixes misparsing of IPv6 addresses without port
+       {
                port = atoi(colon + 1);
+       }
        else
                colon = string + strlen(string);
        if (port == 0)
@@ -1108,7 +1109,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                SOCKLEN_T inetaddresslength;
                address->addresstype = LHNETADDRESSTYPE_NONE;
                inetaddresslength = sizeof(address->addr.in6);
-               value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, 0, &address->addr.sock, &inetaddresslength);
+               value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, LHNET_RECVFROM_FLAGS, &address->addr.sock, &inetaddresslength);
                if (value > 0)
                {
                        address->addresstype = LHNETADDRESSTYPE_INET6;