iwinfo: properly decode SSIDs when scanning through wpa_supplicant
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org> SVN-Revision: 42273
This commit is contained in:
parent
823659f458
commit
9d2bdd8585
2 changed files with 63 additions and 4 deletions
|
@ -7,7 +7,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=libiwinfo
|
PKG_NAME:=libiwinfo
|
||||||
PKG_RELEASE:=50
|
PKG_RELEASE:=51
|
||||||
|
|
||||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||||
PKG_CONFIG_DEPENDS := \
|
PKG_CONFIG_DEPENDS := \
|
||||||
|
|
|
@ -1881,11 +1881,70 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
|
||||||
return *len ? 0 : -1;
|
return *len ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int wpasupp_ssid_decode(const char *in, char *out, int outlen)
|
||||||
|
{
|
||||||
|
#define hex(x) \
|
||||||
|
(((x) >= 'a') ? ((x) - 'a' + 10) : \
|
||||||
|
(((x) >= 'A') ? ((x) - 'A' + 10) : ((x) - '0')))
|
||||||
|
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
while (*in)
|
||||||
|
{
|
||||||
|
if (len + 1 >= outlen)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (*in)
|
||||||
|
{
|
||||||
|
case '\\':
|
||||||
|
in++;
|
||||||
|
switch (*in)
|
||||||
|
{
|
||||||
|
case 'n':
|
||||||
|
out[len++] = '\n'; in++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
out[len++] = '\r'; in++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
out[len++] = '\t'; in++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'e':
|
||||||
|
out[len++] = '\e'; in++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'x':
|
||||||
|
if (isxdigit(*(in+1)) && isxdigit(*(in+2)))
|
||||||
|
out[len++] = hex(*(in+1)) * 16 + hex(*(in+2));
|
||||||
|
in += 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
out[len++] = *in++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
out[len++] = *in++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outlen > len)
|
||||||
|
out[len] = '\0';
|
||||||
|
|
||||||
|
return 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, mode;
|
int freq, rssi, qmax, count, mode;
|
||||||
char *res;
|
char *res;
|
||||||
char ssid[128] = { 0 };
|
char ssid[129] = { 0 };
|
||||||
char bssid[18] = { 0 };
|
char bssid[18] = { 0 };
|
||||||
char cipher[256] = { 0 };
|
char cipher[256] = { 0 };
|
||||||
|
|
||||||
|
@ -1930,7 +1989,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
|
||||||
count++;
|
count++;
|
||||||
goto nextline;
|
goto nextline;
|
||||||
}
|
}
|
||||||
if (sscanf(res, "%17s %d %d %255s%*[ \t]%127[^\n]\n",
|
if (sscanf(res, "%17s %d %d %255s%*[ \t]%128[^\n]\n",
|
||||||
bssid, &freq, &rssi, cipher, ssid) < 5)
|
bssid, &freq, &rssi, cipher, ssid) < 5)
|
||||||
{
|
{
|
||||||
/* skip malformed lines */
|
/* skip malformed lines */
|
||||||
|
@ -1945,7 +2004,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
|
||||||
e->mac[5] = strtol(&bssid[15], NULL, 16);
|
e->mac[5] = strtol(&bssid[15], NULL, 16);
|
||||||
|
|
||||||
/* SSID */
|
/* SSID */
|
||||||
memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1));
|
wpasupp_ssid_decode(ssid, e->ssid, sizeof(e->ssid));
|
||||||
|
|
||||||
/* Mode (assume master) */
|
/* Mode (assume master) */
|
||||||
if (strstr(cipher,"[MESH]"))
|
if (strstr(cipher,"[MESH]"))
|
||||||
|
|
Loading…
Reference in a new issue