iwinfo: avoid creating tmp.* ifaces for scanning
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 25 Jul 2014 15:52:17 +0000 (15:52 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 25 Jul 2014 15:52:17 +0000 (15:52 +0000)
If the iface to scan on already is in ad-hoc, station or monitor mode
then do not spawn a temporary iface.

Also preventively disable IPv6 on temporary ifaces before bringing them
up to avoid potential security issues.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
SVN-Revision: 41830

package/network/utils/iwinfo/src/iwinfo_nl80211.c

index c8b167b32ab0b57c05020cc616cca3588d93564d..5550e92f2f33d8e2ffe4c720d34de0ed65b5a56f 100644 (file)
@@ -720,9 +720,10 @@ out:
 static char * nl80211_ifadd(const char *ifname)
 {
        int phyidx;
-       char *rv = NULL;
+       char *rv = NULL, path[PATH_MAX];
        static char nif[IFNAMSIZ] = { 0 };
        struct nl80211_msg_conveyor *req, *res;
+       FILE *sysfs;
 
        req = nl80211_msg(ifname, NL80211_CMD_NEW_INTERFACE, 0);
        if (req)
@@ -734,6 +735,15 @@ static char * nl80211_ifadd(const char *ifname)
 
                nl80211_send(req, NULL, NULL);
 
+               snprintf(path, sizeof(path) - 1,
+                        "/proc/sys/net/ipv6/conf/%s/disable_ipv6", nif);
+
+               if ((sysfs = fopen(path, "w")) != NULL)
+               {
+                       fwrite("0\n", 1, 2, sysfs);
+                       fclose(sysfs);
+               }
+
                rv = nif;
 
        nla_put_failure:
@@ -1865,7 +1875,7 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
 
 static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
 {
-       int freq, rssi, qmax, count;
+       int freq, rssi, qmax, count, mode;
        char *res;
        char ssid[128] = { 0 };
        char bssid[18] = { 0 };
@@ -1983,6 +1993,16 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
                }
        }
 
+       /* station / ad-hoc / monitor scan */
+       else if (!nl80211_get_mode(ifname, &mode) &&
+                (mode == IWINFO_OPMODE_ADHOC ||
+                 mode == IWINFO_OPMODE_CLIENT ||
+                 mode == IWINFO_OPMODE_MONITOR) &&
+                iwinfo_ifup(ifname))
+       {
+               return nl80211_get_scanlist_nl(ifname, buf, len);
+       }
+
        /* AP scan */
        else
        {