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)

Reply via email to