This is an automated email from the ASF dual-hosted git repository. jerpelea pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 22d11aafa2 simwifi: Transfer the special characters in ssid. 22d11aafa2 is described below commit 22d11aafa2be0fb09cb3782bc03cc4986123c523 Author: liqinhui <liqin...@xiaomi.com> AuthorDate: Wed Oct 25 11:09:31 2023 +0800 simwifi: Transfer the special characters in ssid. The SSID can be configured with special symbols suach as single quotations, double quotations and backslashes, which need to be escaped. Signed-off-by: liqinhui <liqin...@xiaomi.com> --- arch/sim/src/sim/sim_wifidriver.c | 66 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/arch/sim/src/sim/sim_wifidriver.c b/arch/sim/src/sim/sim_wifidriver.c index 87841d8946..5a09b60755 100644 --- a/arch/sim/src/sim/sim_wifidriver.c +++ b/arch/sim/src/sim/sim_wifidriver.c @@ -422,6 +422,62 @@ static int mac_addr_a2n(unsigned char *mac_addr, char *arg) return OK; } +static int utf8_escape(char *outp, int out_size, + const char *inp, size_t in_size) +{ + size_t res_size = 0; + + if (!inp || !outp) + { + return -EINVAL; + } + + /* The inp may or may not be NUL terminated, but must be + * if 0 size is specified. + */ + + if (!in_size) + { + in_size = strlen(inp); + } + + while (in_size) + { + in_size--; + + if (res_size++ >= out_size) + { + return -EINVAL; + } + + switch (*inp) + { + case '\\': + case '\'': + case '\"': + if (res_size++ >= out_size) + { + return -EINVAL; + } + + *outp++ = '\\'; + + default: + *outp++ = *inp++; + break; + } + } + + /* NUL terminate if space allows */ + + if (res_size < out_size) + { + *outp = '\0'; + } + + return 0; +} + static int copy_scan_results(struct sim_scan_result_s *scan_req, struct sim_bss_info_s *info) { @@ -909,6 +965,7 @@ static int wifidriver_set_essid(struct sim_netdev_s *wifidev, struct iwreq *pwrq) { char ssid_buf[SSID_MAX_LEN]; + char out_ssid[256]; int ret = 0; uint8_t ssid_len = pwrq->u.essid.length; @@ -921,7 +978,14 @@ static int wifidriver_set_essid(struct sim_netdev_s *wifidev, if (wifidev->mode == IW_MODE_INFRA) { - WPA_SET_NETWORK(wifidev, "ssid \\\"%s\\\"", ssid_buf); + ret = utf8_escape(out_ssid, sizeof(out_ssid), ssid_buf, ssid_len); + if (ret < 0) + { + return ret; + } + + WPA_SET_NETWORK(wifidev, "ssid \"\\\"%s\\\"\"", out_ssid); + WPA_SET_NETWORK(wifidev, "scan_ssid 1"); if (wifidev->psk_flag == 0)