diff -up socat-1.7.1.3/xio-tun.c.orig socat-1.7.1.3/xio-tun.c --- socat-1.7.1.3/xio-tun.c.orig 2011-05-19 20:25:38.654799000 +0200 +++ socat-1.7.1.3/xio-tun.c 2011-05-19 20:37:48.675627004 +0200 @@ -78,8 +78,8 @@ static int xioopen_tun(int argc, const c char *ifaddr; int result; - if (argc != 2) { - Error2("%s: wrong number of parameters (%d instead of 1)", + if (argc > 2 || argc < 0) { + Error2("%s: wrong number of parameters (%d instead of 0 or 1)", argv[0], argc-1); } @@ -146,30 +146,31 @@ static int xioopen_tun(int argc, const c } /*--------------------- setting interface address and netmask ------------*/ - if ((ifaddr = strdup(argv[1])) == NULL) { - Error1("strdup(\"%s\"): out of memory", argv[1]); - return STAT_RETRYLATER; + if (argc == 2) { + if ((ifaddr = strdup(argv[1])) == NULL) { + Error1("strdup(\"%s\"): out of memory", argv[1]); + return STAT_RETRYLATER; + } + if ((result = xioparsenetwork(ifaddr, pf, &network)) != STAT_OK) { + /*! recover */ + return result; + } + socket_init(pf, (union sockaddr_union *)&ifr.ifr_addr); + ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr = + network.netaddr.ip4.sin_addr; + if (Ioctl(sockfd, SIOCSIFADDR, &ifr) < 0) { + Error4("ioctl(%d, SIOCSIFADDR, {\"%s\", \"%s\"}: %s", + sockfd, ifr.ifr_name, ifaddr, strerror(errno)); + } + ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr = + network.netmask.ip4.sin_addr; + if (Ioctl(sockfd, SIOCSIFNETMASK, &ifr) < 0) { + Error4("ioctl(%d, SIOCSIFNETMASK, {\"0x%08u\", \"%s\"}, %s", + sockfd, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr, + ifaddr, strerror(errno)); + } + free(ifaddr); } - if ((result = xioparsenetwork(ifaddr, pf, &network)) != STAT_OK) { - /*! recover */ - return result; - } - socket_init(pf, (union sockaddr_union *)&ifr.ifr_addr); - ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr = - network.netaddr.ip4.sin_addr; - if (Ioctl(sockfd, SIOCSIFADDR, &ifr) < 0) { - Error4("ioctl(%d, SIOCSIFADDR, {\"%s\", \"%s\"}: %s", - sockfd, ifr.ifr_name, ifaddr, strerror(errno)); - } - ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr = - network.netmask.ip4.sin_addr; - if (Ioctl(sockfd, SIOCSIFNETMASK, &ifr) < 0) { - Error4("ioctl(%d, SIOCSIFNETMASK, {\"0x%08u\", \"%s\"}, %s", - sockfd, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr, - ifaddr, strerror(errno)); - } - free(ifaddr); - /*--------------------- setting interface flags --------------------------*/ applyopts_single(&xfd->stream, opts, PH_FD);