[PATCH 2/3] fix crash for unsupported wireless- key format



From: Alexander Sack <asac jwsdot com>

* system-settings/plugins/ifupdown/parser.c
 	- (normalize_dupe_wireless_key,
 		update_wireless_security_setting_from_if_block): fix
 			ifupdown crash caused by previously not support key
 			format for 'key', 'wep-key0', 'wep-key1', 'wep-key2',
 			'wep-key3' (debbugs: #513874)


Signed-off-by: Alexander Sack <asac ubuntu com>
---
 ChangeLog                                 |    5 ++++
 system-settings/plugins/ifupdown/parser.c |   36 +++++++++++++++++++++++++----
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0e03d80..a5542b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,11 @@
 	* system-settings/plugins/ifupdown/parser.c
 		- (update_wireless_setting_from_if_block): fix ifupdown
 			crash for wireless-ssid setting (debbugs: #513852)
+		- (normalize_dupe_wireless_key,
+		   update_wireless_security_setting_from_if_block): fix
+			ifupdown crash caused by previously not	support key
+			format for 'key', 'wep-key0', 'wep-key1', 'wep-key2',
+			'wep-key3' (debbugs: #513874)
 
 2008-12-11  Dan Williams  <dcbw redhat com>
 
diff --git a/system-settings/plugins/ifupdown/parser.c b/system-settings/plugins/ifupdown/parser.c
index 25e866a..451ce8a 100644
--- a/system-settings/plugins/ifupdown/parser.c
+++ b/system-settings/plugins/ifupdown/parser.c
@@ -197,6 +197,32 @@ typedef gchar* (*IfupdownStrDupeFunc) (gpointer value, gpointer data);
 typedef gpointer (*IfupdownStrToTypeFunc) (const gchar* value);
 
 static char*
+normalize_dupe_wireless_key (gpointer value, gpointer data) {
+	char* valuec = value;
+	char* endc = valuec + strlen (valuec);
+	char* delim = valuec;
+	char* next = delim;
+	char* result = malloc (strlen (valuec) + 1);
+	char* result_cur = result;
+
+	while (*delim && (next = strchr (delim, '-')) != NULL) {
+		if (next == delim) {
+			delim++;
+			continue;
+		}
+		strncpy (result_cur, delim, next - delim);
+		result_cur += next - delim;
+		delim = next + 1;
+	}
+	if (*delim && strlen (valuec) > GPOINTER_TO_UINT(delim - valuec)) {
+		strncpy (result_cur, delim, endc - delim);
+		result_cur += endc - delim;
+	}
+	*result_cur = '\0';
+	return result;
+}
+
+static char*
 normalize_dupe (gpointer value, gpointer data) {
 	return g_strdup(value);
 }
@@ -295,16 +321,16 @@ update_wireless_security_setting_from_if_block(NMConnection *connection,
 		{"psk", normalize_psk},
 		{"identity", normalize_dupe},
 		{"password", normalize_dupe},
-		{"key", normalize_dupe},
+		{"key", normalize_dupe_wireless_key},
 		{"key-mgmt", normalize_tolower},
 		{"group", normalize_tolower},
 		{"pairwise", normalize_tolower},
 		{"proto", normalize_tolower},
 		{"pin", normalize_dupe},
-		{"wep-key0", normalize_dupe},
-		{"wep-key1", normalize_dupe},
-		{"wep-key2", normalize_dupe},
-		{"wep-key3", normalize_dupe},
+		{"wep-key0", normalize_dupe_wireless_key},
+		{"wep-key1", normalize_dupe_wireless_key},
+		{"wep-key2", normalize_dupe_wireless_key},
+		{"wep-key3", normalize_dupe_wireless_key},
 		{"wep-tx-keyidx", normalize_dupe},
 		{ NULL, NULL}
 	};
-- 
1.6.0.4



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]