[openwrt/openwrt] wifi-scripts: ucode: fix ssid handling

LEDE Commits lede-commits at lists.infradead.org
Sat Aug 2 08:44:59 PDT 2025


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/287f1ea3dd5b76bc778b3d375d271fd24815e05b

commit 287f1ea3dd5b76bc778b3d375d271fd24815e05b
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Sat Aug 2 17:43:26 2025 +0200

    wifi-scripts: ucode: fix ssid handling
    
    Add proper escaping for ssid values.
    Use it to fix multi-ap backhaul ssid.
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../files-ucode/usr/share/ucode/wifi/ap.uc         | 18 ++++++------
 .../files-ucode/usr/share/ucode/wifi/common.uc     | 32 ++++++++++++++++++++++
 .../files-ucode/usr/share/ucode/wifi/supplicant.uc |  6 ++--
 3 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc
index 62e3ec0afb..8296f01195 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc
@@ -4,7 +4,7 @@ import * as libuci from 'uci';
 import { md5 } from 'digest';
 import * as fs from 'fs';
 
-import { append, append_raw, append_value, append_vars, comment, push_config, set_default, touch_file } from 'wifi.common';
+import { append, append_raw, append_value, append_vars, append_string_vars, comment, push_config, set_default, touch_file } from 'wifi.common';
 import * as netifd from 'wifi.netifd';
 import * as iface from 'wifi.iface';
 
@@ -44,17 +44,19 @@ function iface_setup(config) {
 		config.ap_isolate = 1;
 
 	append('bssid', config.macaddr);
+	config.ssid2 = config.ssid;
+	append_string_vars(config, [ 'ssid2' ]);
 
-append_vars(config, [
+	append_vars(config, [
 		'ctrl_interface', 'ap_isolate', 'max_num_sta', 'ap_max_inactivity', 'airtime_bss_weight',
 		'airtime_bss_limit', 'airtime_sta_weight', 'bss_load_update_period', 'chan_util_avg_period',
 		'disassoc_low_ack', 'skip_inactivity_poll', 'ignore_broadcast_ssid', 'uapsd_advertisement_enabled',
-		'utf8_ssid', 'multi_ap', 'ssid', 'tdls_prohibit', 'bridge', 'wds_sta', 'wds_bridge',
+		'utf8_ssid', 'multi_ap', 'tdls_prohibit', 'bridge', 'wds_sta', 'wds_bridge',
 		'snoop_iface', 'vendor_elements', 'nas_identifier', 'radius_acct_interim_interval',
 		'ocv', 'multicast_to_unicast', 'preamble', 'wmm_enabled', 'proxy_arp', 'per_sta_vif', 'mbo',
 		'bss_transition', 'wnm_sleep_mode', 'wnm_sleep_mode_no_keys', 'qos_map_set', 'max_listen_int',
 		'dtim_period',
-	 ]);
+	]);
 }
 
 function iface_authentication_server(config) {
@@ -102,11 +104,9 @@ function iface_auth_type(config) {
 		config.wps_possible = 1;
 		config.wps_state = 1;
 
-		if (config.owe_transition_ssid)
-			config.owe_transition_ssid = `"${config.owe_transition_ssid}"`;
-
+		append_string_vars(config, [ 'owe_transition_ssid' ]);
 		append_vars(config, [
-			'owe_transition_ssid', 'owe_transition_bssid', 'owe_transition_ifname',
+			'owe_transition_bssid', 'owe_transition_ifname',
 		]);
 		break;
 
@@ -200,7 +200,7 @@ function iface_wps(config) {
 			set_default(config, 'upnp_iface', config.network_bridge);
 
 		if (config.multi_ap && config.multi_ap_backhaul_ssid) {
-			append_vars(config, [ 'multi_ap_backhaul_ssid' ]);
+			append_string_vars(config, [ 'multi_ap_backhaul_ssid' ]);
 			if (length(config.multi_ap_backhaul_key) == 64)
 				append('multi_ap_backhaul_wpa_psk', config.multi_ap_backhaul_key);
 			else if (length(config.multi_ap_backhaul_key) > 8)
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc
index 2dc11f50b9..0418fe8b76 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/common.uc
@@ -32,11 +32,31 @@ export function append(key, value) {
 	append_raw(key + '=' + value);
 };
 
+function escape_string(value) {
+	let chars = map(split(value, ''), (v) => ord(v));
+	if (length(filter(chars, (v) => (v < 32 || v >= 128))) > 0)
+		return hexenc(value);
+
+	return `"${value}"`;
+}
+
+export function append_string(key, value) {
+	if (value == null)
+		return;
+
+	append(key, escape_string(value));
+};
+
 export function append_vars(dict, keys) {
 	for (let key in keys)
 		append(key, dict[key]);
 };
 
+export function append_string_vars(dict, keys) {
+	for (let key in keys)
+		append_string(key, dict[key]);
+};
+
 export function network_append_raw(value) {
 	network_data += value + '\n';
 };
@@ -57,11 +77,23 @@ export function network_append(key, value) {
 	network_append_raw('\t' + key + '=' + value);
 };
 
+export function network_append_string(key, value) {
+	if (value == null)
+		return;
+
+	network_append_raw('\t' + key + '=' + escape_string(value));
+};
+
 export function network_append_vars(dict, keys) {
 	for (let key in keys)
 		network_append(key, dict[key]);
 };
 
+export function network_append_string_vars(dict, keys) {
+	for (let key in keys)
+		network_append_string(key, dict[key]);
+};
+
 export function set_default(dict, key, value) {
 	if (dict[key] == null)
 		dict[key] = value;
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
index 2942767f0b..a006550efa 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
@@ -1,7 +1,7 @@
 'use strict';
 
 import { append, append_raw, append_vars, network_append, network_append_raw, network_append_vars,
-	 set_default, dump_network, flush_network } from 'wifi.common';
+	 network_append_string_vars, set_default, dump_network, flush_network } from 'wifi.common';
 import * as netifd from 'wifi.netifd';
 import * as iface from 'wifi.iface';
 import * as fs from 'fs';
@@ -157,14 +157,14 @@ function setup_sta(data, config) {
 
 	config.basic_rate = ratelist(config.basic_rate);
 	config.mcast_rate = ratestr(config.mcast_rate);
-	config.ssid = `"${config.ssid}"`;
 
+	network_append_string_vars(config, [ 'ssid' ]);
 	network_append_vars(config, [
 		'scan_ssid', 'noscan', 'disabled', 'multi_ap_backhaul_sta',
 		'ocv', 'key_mgmt', 'psk', 'sae_password', 'pairwise', 'group', 'bssid',
 		'proto', 'mesh_fwding', 'mesh_rssi_threshold', 'frequency', 'fixed_freq',
 		'disable_ht', 'disable_ht40', 'disable_vht', 'vht', 'max_oper_chwidth',
-		'ht40', 'ssid', 'beacon_int', 'ieee80211w', 'basic_rate', 'mcast_rate',
+		'ht40', 'beacon_int', 'ieee80211w', 'basic_rate', 'mcast_rate',
 		'bssid_blacklist', 'bssid_whitelist', 'erp', 'ca_cert', 'identity',
 		'anonymous_identity', 'client_cert', 'private_key', 'private_key_passwd',
 		'subject_match', 'altsubject_match', 'domain_match', 'domain_suffix_match',




More information about the lede-commits mailing list