Don't free struct addrinfo too early. Spotted by Christian Cier-Zniewski.
[tinc] / src / mingw / device.c
index 004249c..2813a88 100644 (file)
@@ -1,7 +1,7 @@
 /*
     device.c -- Interaction with Windows tap driver in a MinGW environment
     Copyright (C) 2002-2005 Ivo Timmermans,
-                  2002-2006 Guus Sliepen <guus@tinc-vpn.org>
+                  2002-2007 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -76,18 +76,20 @@ DWORD WINAPI tapreader(void *bla) {
 
        sock = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP);
 
-       freeaddrinfo(ai);
-
        if(sock < 0) {
                logger(LOG_ERR, _("System call `%s' failed: %s"), "socket", strerror(errno));
+               freeaddrinfo(ai);
                return -1;
        }
 
        if(connect(sock, ai->ai_addr, ai->ai_addrlen)) {
                logger(LOG_ERR, _("System call `%s' failed: %s"), "connect", strerror(errno));
+               freeaddrinfo(ai);
                return -1;
        }
 
+       freeaddrinfo(ai);
+
        logger(LOG_DEBUG, _("Tap reader running"));
 
        /* Read from tap device and send to parent */
@@ -143,7 +145,7 @@ bool setup_device(void)
                .ai_family = AF_UNSPEC,
                .ai_socktype = SOCK_STREAM,
                .ai_protocol = IPPROTO_TCP,
-               .ai_flags = AI_PASSIVE,
+               .ai_flags = 0,
        };
 
        cp();