iwinfo: avoid creating tmp.* ifaces for scanning

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
This commit is contained in:
Jo-Philipp Wich 2014-07-25 15:52:17 +00:00
parent bd7642f1a9
commit b84346e141

View file

@ -720,9 +720,10 @@ out:
static char * nl80211_ifadd(const char *ifname) static char * nl80211_ifadd(const char *ifname)
{ {
int phyidx; int phyidx;
char *rv = NULL; char *rv = NULL, path[PATH_MAX];
static char nif[IFNAMSIZ] = { 0 }; static char nif[IFNAMSIZ] = { 0 };
struct nl80211_msg_conveyor *req, *res; struct nl80211_msg_conveyor *req, *res;
FILE *sysfs;
req = nl80211_msg(ifname, NL80211_CMD_NEW_INTERFACE, 0); req = nl80211_msg(ifname, NL80211_CMD_NEW_INTERFACE, 0);
if (req) if (req)
@ -734,6 +735,15 @@ static char * nl80211_ifadd(const char *ifname)
nl80211_send(req, NULL, NULL); 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; rv = nif;
nla_put_failure: 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) 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 *res;
char ssid[128] = { 0 }; char ssid[128] = { 0 };
char bssid[18] = { 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 */ /* AP scan */
else else
{ {