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

Reply via email to