Author: jow Date: 2014-08-25 14:46:27 +0200 (Mon, 25 Aug 2014) New Revision: 42285
Modified: branches/barrier_breaker/package/network/utils/iwinfo/Makefile branches/barrier_breaker/package/network/utils/iwinfo/src/iwinfo_nl80211.c Log: BB: iwinfo: properly decode SSIDs when scanning through wpa_supplicant Signed-off-by: Jo-Philipp Wich <[email protected]> Backport of r42273 Modified: branches/barrier_breaker/package/network/utils/iwinfo/Makefile =================================================================== --- branches/barrier_breaker/package/network/utils/iwinfo/Makefile 2014-08-25 12:39:34 UTC (rev 42284) +++ branches/barrier_breaker/package/network/utils/iwinfo/Makefile 2014-08-25 12:46:27 UTC (rev 42285) @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libiwinfo -PKG_RELEASE:=50 +PKG_RELEASE:=51 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_CONFIG_DEPENDS := \ Modified: branches/barrier_breaker/package/network/utils/iwinfo/src/iwinfo_nl80211.c =================================================================== --- branches/barrier_breaker/package/network/utils/iwinfo/src/iwinfo_nl80211.c 2014-08-25 12:39:34 UTC (rev 42284) +++ branches/barrier_breaker/package/network/utils/iwinfo/src/iwinfo_nl80211.c 2014-08-25 12:46:27 UTC (rev 42285) @@ -1881,11 +1881,70 @@ 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) { int freq, rssi, qmax, count, mode; char *res; - char ssid[128] = { 0 }; + char ssid[129] = { 0 }; char bssid[18] = { 0 }; char cipher[256] = { 0 }; @@ -1930,7 +1989,7 @@ count++; 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) { /* skip malformed lines */ @@ -1945,7 +2004,7 @@ e->mac[5] = strtol(&bssid[15], NULL, 16); /* SSID */ - memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1)); + wpasupp_ssid_decode(ssid, e->ssid, sizeof(e->ssid)); /* Mode (assume master) */ if (strstr(cipher,"[MESH]")) _______________________________________________ openwrt-commits mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits
