diff --git a/package/network/utils/iwinfo/Makefile b/package/network/utils/iwinfo/Makefile
index e4ee73a1124690c80e82f38a2ef4941acbb0eca8..db46bbc07d5b354257aa4e85f678d8e4c3f25001 100644
--- a/package/network/utils/iwinfo/Makefile
+++ b/package/network/utils/iwinfo/Makefile
@@ -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 := \
diff --git a/package/network/utils/iwinfo/src/iwinfo_nl80211.c b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
index 33c62387e3c3b9d87b5c4a33240308a93eb0c64c..7711b611020809d6844dd9d4c7368dc0f57ad35b 100644
--- a/package/network/utils/iwinfo/src/iwinfo_nl80211.c
+++ b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
@@ -1881,11 +1881,70 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
 	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 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
 					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 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
 				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]"))