e_mod_split_screen_manager: Change sscanf to strstr and strncpy 99/298099/3
authorJunseok Kim <juns.kim@samsung.com>
Thu, 31 Aug 2023 11:08:54 +0000 (20:08 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 5 Sep 2023 04:18:34 +0000 (04:18 +0000)
Change sscanf to strstr and strncpy to avoid risky function.
And use defined hint length for consistency.

Change-Id: I1eda5ce01cbea66d8a9130a1d861b6ba57fd7479

src/splitscreen/e_mod_split_screen_manager.c

index 767ddaf..fb1ae0d 100644 (file)
@@ -8,6 +8,8 @@
 #define E_MOD_SPLIT_SCREEN_SUB_REGION2 "sub2"
 #define E_MOD_SPLIT_SCREEN_SYSTEM_UI_REGION "SystemUI"
 
+#define MAX_HINT_LEN 255
+
 typedef Eina_Bool (*E_Mod_Split_Screen_Manager_Hint_Func)(E_Client *ec, const char *name, const char *value);
 struct _E_Mod_Split_Screen_Manager_Hint_Handler
 {
@@ -214,30 +216,49 @@ _e_mod_split_screen_manager_hint_assign_region(E_Client *ec, const char *name, c
    E_Mod_Split_Screen_Region *emssr;
    Eina_Stringshare *appid;
 
-   int ret = 0;
-   char _region_name[10] = {0,};
-   char _appid[255] = {0,};
+   char _region_name[MAX_HINT_LEN+1] = {0,};
+   char _appid[MAX_HINT_LEN+1] = {0,};
+   size_t parsed_name_len = 0, parsed_appid_len = 0;
+   char *spliter = NULL, *parsed_appid = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
 
-   // hint value format: region_name/appid
-   ret = sscanf(value, "%[^/]/%s", _region_name, _appid);
-   if (ret < 0) return EINA_FALSE;
+   // parse hint value, format: region_name/appid
+   spliter = strstr(value, "/");
+   if (!spliter)
+     {
+        SSMERR("couldn't parse hint value:%s", ec, value);
+        return EINA_FALSE;
+     }
 
-   SSMINF("client appid(%s) -> assign to region:%s", ec, _appid, _region_name);
+   parsed_name_len = spliter - value;
+   parsed_appid = spliter + 1;
+   parsed_appid_len = strlen(parsed_appid);
 
-   if ((strlen(_region_name) <= 0) || strlen(_region_name) > 10)
+   if ((parsed_name_len > 0) &&
+       (parsed_name_len < MAX_HINT_LEN))
      {
-        SSMERR("invalid region name:%s", ec, _region_name);
+        strncpy(_region_name, value, parsed_name_len);
+     }
+   else
+     {
+        SSMERR("invalid value:%s, name_len:%d", ec, value, parsed_name_len);
         return EINA_FALSE;
      }
 
-   if ((strlen(_appid) <= 0) || (strlen(_appid) > 255))
+   if ((parsed_appid_len > 0) &&
+       (parsed_appid_len < MAX_HINT_LEN))
      {
-        SSMERR("invalid app id:%s", ec, _appid);
+        strncpy(_appid, parsed_appid, MAX_HINT_LEN);
+     }
+   else
+     {
+        SSMERR("invalid value:%s, appid_len:%d", ec, value, parsed_appid_len);
         return EINA_FALSE;
      }
 
+   SSMINF("client appid(%s) -> assign to region:%s", ec, _appid, _region_name);
+
    emssr = _e_mod_split_screen_manager_find_region_by_name(_region_name);
    if (!emssr)
      {
@@ -260,7 +281,7 @@ _e_mod_split_screen_manager_hint_assign_region_sub1(E_Client *ec, const char *na
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
 
-   if ((strlen(value) <= 0) || strlen(value) > 255)
+   if ((strlen(value) <= 0) || strlen(value) > MAX_HINT_LEN)
      {
         SSMERR("invalid app id:%s", ec, value);
         return EINA_FALSE;
@@ -288,7 +309,7 @@ _e_mod_split_screen_manager_hint_assign_region_sub2(E_Client *ec, const char *na
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE);
 
-   if ((strlen(value) <= 0) || strlen(value) > 255)
+   if ((strlen(value) <= 0) || strlen(value) > MAX_HINT_LEN)
      {
         SSMERR("invalid app id:%s", ec, value);
         return EINA_FALSE;