removed unsafe sscanf 45/125745/1 accepted/tizen/unified/20170419.165641 submit/tizen/20170419.100911
authorGwanglim Lee <gl77.lee@samsung.com>
Tue, 18 Apr 2017 13:43:08 +0000 (22:43 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 18 Apr 2017 13:44:19 +0000 (22:44 +0900)
Change-Id: Iaa2e305a6f46a4f01e03d9f36722eb533df11e42

src/bin/e_actions.c
src/bin/e_info_client.c
src/bin/e_info_server.c
src/bin/e_main.c
src/bin/e_utils.c
src/bin/e_utils.h

index 0c6fee2..d635b62 100644 (file)
@@ -1642,24 +1642,6 @@ _delayed_action_free(Delayed_Action *da)
    free(da);
 }
 
-static Eina_Bool
-_delayed_action_cb_timer(void *data)
-{
-   Delayed_Action *da;
-   E_Action *act;
-
-   da = data;
-   da->timer = NULL;
-   act = e_action_find(da->delayed.action);
-   if (act)
-     {
-        if (act->func.go) act->func.go(da->obj, da->delayed.params);
-     }
-   _delayed_actions = eina_list_remove(_delayed_actions, da);
-   _delayed_action_free(da);
-   return ECORE_CALLBACK_CANCEL;
-}
-
 static void
 _delayed_action_do(Delayed_Action *da)
 {
@@ -1673,75 +1655,7 @@ _delayed_action_do(Delayed_Action *da)
 }
 
 static void
-_delayed_action_list_parse_action(const char *str, double *delay, const char **action, const char **params)
-{
-   char fbuf[16];
-   char buf[1024];
-   const char *p;
-
-   buf[0] = 0;
-   sscanf(str, "%10s %1000s", fbuf, buf);
-   *action = eina_stringshare_add(buf);
-   *delay = atof(fbuf);
-   p = strchr(str, ' ');
-   if (p)
-     {
-        p++;
-        p = strchr(p, ' ');
-        if (p)
-          {
-             p++;
-             *params = eina_stringshare_add(p);
-          }
-     }
-}
-
-static void
-_delayed_action_list_parse(Delayed_Action *da, const char *params)
-{
-   double delay = 2.0;
-   const char *p, *a1start = NULL, *a1stop = NULL;
-   const char *a2start = NULL, *a2stop = NULL;
-
-   // FORMAT: "[0.0 default_action param1 param2] [x.x action2 param1 param2]"
-   p = params;
-   while (*p)
-     {
-        if ((*p == '[') && ((p == params) || ((p > params) && (p[-1] != '\\')))) {a1start = p + 1; break; }
-        p++;
-     }
-   while (*p)
-     {
-        if ((*p == ']') && ((p == params) || ((p > params) && (p[-1] != '\\')))) {a1stop = p; break; }
-        p++;
-     }
-   while (*p)
-     {
-        if ((*p == '[') && ((p == params) || ((p > params) && (p[-1] != '\\')))) {a2start = p + 1; break; }
-        p++;
-     }
-   while (*p)
-     {
-        if ((*p == ']') && ((p == params) || ((p > params) && (p[-1] != '\\')))) {a2stop = p; break; }
-        p++;
-     }
-   if ((a1start) && (a2start) && (a1stop) && (a2stop))
-     {
-        char *a1, *a2;
-
-        a1 = alloca(a1stop - a1start + 1);
-        eina_strlcpy(a1, a1start, a1stop - a1start + 1);
-        _delayed_action_list_parse_action(a1, &delay, &da->def.action, &da->def.params);
-
-        a2 = alloca(a1stop - a1start + 1);
-        eina_strlcpy(a2, a2start, a2stop - a2start + 1);
-        _delayed_action_list_parse_action(a2, &delay, &da->delayed.action, &da->delayed.params);
-     }
-   da->timer = ecore_timer_add(delay, _delayed_action_cb_timer, da);
-}
-
-static void
-_delayed_action_key_add(E_Object *obj, const char *params, Ecore_Event_Key *ev)
+_delayed_action_key_add(E_Object *obj, const char *params EINA_UNUSED, Ecore_Event_Key *ev)
 {
    Delayed_Action *da;
 
@@ -1754,7 +1668,6 @@ _delayed_action_key_add(E_Object *obj, const char *params, Ecore_Event_Key *ev)
      }
    da->mouse = 0;
    da->key = eina_stringshare_add(ev->key);
-   if (params) _delayed_action_list_parse(da, params);
    _delayed_actions = eina_list_append(_delayed_actions, da);
 }
 
@@ -1778,7 +1691,7 @@ _delayed_action_key_del(E_Object *obj, const char *params EINA_UNUSED, Ecore_Eve
 }
 
 static void
-_delayed_action_mouse_add(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev)
+_delayed_action_mouse_add(E_Object *obj, const char *params EINA_UNUSED, E_Binding_Event_Mouse_Button *ev)
 {
    Delayed_Action *da;
 
@@ -1791,7 +1704,6 @@ _delayed_action_mouse_add(E_Object *obj, const char *params, E_Binding_Event_Mou
      }
    da->mouse = 1;
    da->button = ev->button;
-   if (params) _delayed_action_list_parse(da, params);
    _delayed_actions = eina_list_append(_delayed_actions, da);
 }
 
index 9316085..ced235a 100644 (file)
@@ -82,6 +82,76 @@ static Eina_Bool _e_info_client_eldbus_message(const char *method, E_Info_Messag
 static Eina_Bool _e_info_client_eldbus_message_with_args(const char *method, E_Info_Message_Cb cb, const char *signature, ...);
 static void _e_info_client_eldbus_message_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *p);
 
+static Eina_Bool
+_util_string_to_int(const char *str, int *num, int base)
+{
+   char *end;
+   int errsv;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(num, EINA_FALSE);
+
+   const long sl = strtol(str, &end, base);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((end == str), EINA_FALSE); /* given string is not a decimal number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(('\0' != *end), EINA_FALSE); /* given string has extra characters */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type long */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl > INT_MAX), EINA_FALSE); /* greater than INT_MAX */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl < INT_MIN), EINA_FALSE); /* less than INT_MIN */
+
+   *num = (int)sl;
+
+   return EINA_TRUE;
+}
+
+/* buff: string to be parsed
+ * next: return values it contains the address of the first invalid character
+ * num: return value it contains integer value according to the given base
+ */
+static Eina_Bool
+_util_string_to_int_token(const char *str, char **next, int *num, int base)
+{
+   int errsv;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(next, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(num, EINA_FALSE);
+
+   const long sl = strtol(str, next, base);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((*next == str), EINA_FALSE); /* given string is not a decimal number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type long */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl > INT_MAX), EINA_FALSE); /* greater than INT_MAX */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl < INT_MIN), EINA_FALSE); /* less than INT_MIN */
+
+   *num = (int)sl;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_util_string_to_double(const char *str, double *num)
+{
+   char *end;
+   int errsv;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(num, EINA_FALSE);
+
+   const double sd = strtod(str, &end);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((end == str), EINA_FALSE); /* given string is not a floating point number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(('\0' != *end), EINA_FALSE); /* given string has extra characters */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((DBL_MIN == sd || DBL_MAX == sd) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type double */
+
+   *num = sd;
+
+   return EINA_TRUE;
+}
+
 static E_Win_Info *
 _e_win_info_new(Ecore_Window id, uint32_t res_id, int pid, Eina_Bool alpha, int opaque, const char *name, int x, int y, int w, int h, int layer, int visible, int visibility, int iconic, int frame_visible, int focused, int hwc, int pl_zpos, Ecore_Window parent_id, const char *layer_name)
 {
@@ -1499,38 +1569,70 @@ _e_info_client_proc_fps_info(int argc, char **argv)
    while (keepRunning);
 }
 
+static Eina_Bool
+_opt_parse(char *opt, char *delims, int *vals, int n_vals)
+{
+   Eina_Bool res;
+   int n, i;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(n_vals > 0, EINA_FALSE);
+
+   for (i = 0; i < n_vals; i++)
+     {
+        res = _util_string_to_int_token(opt, &opt, &n, 10);
+        EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(
+           (!((strlen(opt) == 0) && (i == (n_vals - 1))) &&
+            (strlen(opt) < 2)),
+           EINA_FALSE);
+        EINA_SAFETY_ON_TRUE_RETURN_VAL((*opt != delims[i]), EINA_FALSE);
+
+        opt = opt + 1;
+        vals[i] = n;
+     }
+
+   return EINA_TRUE;
+}
+
 static void
 _e_info_client_proc_punch(int argc, char **argv)
 {
    int onoff = 0, x = 0, y = 0, w = 0, h = 0;
    int a = 0, r = 0, g = 0, b = 0;
-   char *arg;
+   char delims_geom[] = { 'x', '+', '+', '\0' };
+   int vals_geom[] = { 0, 0, 0, 0 };
+   char delims_col[] = { ',', ',', ',', '\0' };
+   int vals_col[] = { 0, 0, 0, 0 };
+   Eina_Bool res;
 
-   EINA_SAFETY_ON_FALSE_RETURN(argc >= 3);
-   EINA_SAFETY_ON_NULL_RETURN(argv[2]);
+   EINA_SAFETY_ON_FALSE_GOTO(argc >= 3, wrong_args);
+   EINA_SAFETY_ON_NULL_GOTO(argv[2], wrong_args);
+   EINA_SAFETY_ON_NULL_GOTO(argv[3], wrong_args);
 
-   arg = argv[2];
-   if (!strncmp(arg, "on", 2))
-     onoff = 1;
+   if (!strncmp(argv[2], "on", 2)) onoff = 1;
 
-   arg = argv[3];
-   if (arg && sscanf(arg, "%dx%d+%d+%d", &w, &h, &x, &y) < 0)
-     {
-        printf("wrong geometry arguments(<w>x<h>+<x>+<y>\n");
-        return;
-     }
+   res = _opt_parse(argv[3], delims_geom, vals_geom, (sizeof(vals_geom) / sizeof(int)));
+   EINA_SAFETY_ON_FALSE_GOTO(res, wrong_args);
 
-   if (argc == 5 && argv[4])
+   w = vals_geom[0]; h = vals_geom[1];
+   x = vals_geom[2]; y = vals_geom[3];
+
+   if (argc == 5)
      {
-        arg = argv[4];
-        if (sscanf(arg, "%d,%d,%d,%d", &a, &r, &g, &b) < 0)
-          {
-             printf("wrong color arguments(<a>,<r>,<g>,<b>)\n");
-             return;
-          }
+        EINA_SAFETY_ON_NULL_GOTO(argv[4], wrong_args);
+
+        res = _opt_parse(argv[4], delims_col, vals_col, (sizeof(vals_col) / sizeof(int)));
+        EINA_SAFETY_ON_FALSE_GOTO(res, wrong_args);
+
+        a = vals_col[0]; r = vals_col[1]; g = vals_col[2]; b = vals_col[3];
      }
 
    _e_info_client_eldbus_message_with_args("punch", NULL, "iiiiiiiii", onoff, x, y, w, h, a, r, g, b);
+   return;
+
+wrong_args:
+   printf("wrong geometry arguments(<w>x<h>+<x>+<y>\n");
+   printf("wrong color arguments(<a>,<r>,<g>,<b>)\n");
 }
 
 static void
@@ -1683,6 +1785,7 @@ _e_info_client_proc_slot_set(int argc, char **argv)
    int i;
    int mode = 0;
    const char *value = NULL;
+   Eina_Bool res = EINA_FALSE;
 
    if (argc < 3)
      {
@@ -1730,9 +1833,11 @@ _e_info_client_proc_slot_set(int argc, char **argv)
         value = argv[4];
         int32_t value_number;
         if (strlen(value) >= 2 && value[0] == '0' && value[1] == 'x')
-          sscanf(value, "%x", &value_number);
+          res = _util_string_to_int(value, &value_number, 16);
         else
-          sscanf(value, "%d", &value_number);
+          res = _util_string_to_int(value, &value_number, 10);
+
+        EINA_SAFETY_ON_FALSE_RETURN(res);
 
         param[1] = value_number;
      }
@@ -2378,9 +2483,11 @@ _e_info_client_proc_scrsaver(int argc, char **argv)
    else if (eina_streq(argv[2], "timeout"))
      {
         if (argc != 4) goto arg_err;
-        sscanf(argv[3], "%lf", &sec);
-        cmd = E_INFO_CMD_SCRSAVER_TIMEOUT;
 
+        res = _util_string_to_double(argv[3], &sec);
+        EINA_SAFETY_ON_FALSE_GOTO(res, arg_err);
+
+        cmd = E_INFO_CMD_SCRSAVER_TIMEOUT;
         printf("sec: %lf\n", sec);
      }
    else
index e6721a1..ce029b0 100644 (file)
@@ -973,6 +973,7 @@ _msg_window_prop_append(Eldbus_Message_Iter *iter, uint32_t mode, const char *va
    E_Client *ec;
    Evas_Object *o;
    int32_t value_number = 0;
+   Eina_Bool res = EINA_FALSE;
 
    eldbus_message_iter_arguments_append(iter, "a(ss)", &array_of_ec);
 
@@ -982,9 +983,11 @@ _msg_window_prop_append(Eldbus_Message_Iter *iter, uint32_t mode, const char *va
         else
           {
              if (strlen(value) >= 2 && value[0] == '0' && value[1] == 'x')
-                sscanf(value, "%x", &value_number);
+               res = e_util_string_to_int(value, &value_number, 16);
              else
-                sscanf(value, "%d", &value_number);
+               res = e_util_string_to_int(value, &value_number, 10);
+
+             EINA_SAFETY_ON_FALSE_RETURN(res);
           }
      }
 
@@ -1938,6 +1941,7 @@ e_info_server_cb_transform_message(const Eldbus_Service_Interface *iface EINA_UN
    int32_t value_number;
    Evas_Object *o;
    E_Client *ec;
+   Eina_Bool res = EINA_FALSE;
 
    if (!eldbus_message_arguments_get(msg, "siiiiiiii", &value, &transform_id, &enable, &x, &y, &sx, &sy, &degree, &background))
      {
@@ -1946,9 +1950,11 @@ e_info_server_cb_transform_message(const Eldbus_Service_Interface *iface EINA_UN
      }
 
    if (strlen(value) >= 2 && value[0] == '0' && value[1] == 'x')
-      sscanf(value, "%x", &value_number);
+     res = e_util_string_to_int(value, &value_number, 16);
    else
-      sscanf(value, "%d", &value_number);
+     res = e_util_string_to_int(value, &value_number, 10);
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, reply);
 
    for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o))
      {
@@ -2752,6 +2758,7 @@ e_info_server_cb_aux_message(const Eldbus_Service_Interface *iface EINA_UNUSED,
    int32_t win_id = 0;
    E_Client *ec;
    Evas_Object *o;
+   Eina_Bool res = EINA_FALSE;
 
    if (!e_policy)
      {
@@ -2773,7 +2780,9 @@ e_info_server_cb_aux_message(const Eldbus_Service_Interface *iface EINA_UNUSED,
         options = eina_list_append(options, str);
      }
 
-   sscanf(win_str, "%x", &win_id);
+   res = e_util_string_to_int(win_str, &win_id, 16);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, reply);
+
    for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o))
      {
         ec = evas_object_data_get(o, "E_Client");
index f0f2b9b..b894a80 100644 (file)
@@ -1132,27 +1132,7 @@ _e_main_desk_save(void)
 static void
 _e_main_desk_restore(void)
 {
-   const Eina_List *l;
-   E_Zone *zone;
    E_Client *ec;
-   char *env;
-   char name[1024];
-
-   EINA_LIST_FOREACH(e_comp->zones, l, zone)
-     {
-        E_Desk *desk;
-        int desk_x, desk_y;
-        char buf_e[64];
-
-        snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
-        env = getenv(name);
-        if (!env) continue;
-        snprintf(buf_e, sizeof(buf_e), "%s", env);
-        if (!sscanf(buf_e, "%d,%d", &desk_x, &desk_y)) continue;
-        desk = e_desk_at_xy_get(zone, desk_x, desk_y);
-        if (!desk) continue;
-        e_desk_show(desk);
-     }
 
    E_CLIENT_REVERSE_FOREACH(ec)
      if ((!e_client_util_ignored_get(ec)) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))
index c068d56..474adfc 100644 (file)
@@ -975,6 +975,76 @@ e_util_string_append_quoted(char *str, size_t *size, size_t *len, const char *sr
    return str;
 }
 
+E_API Eina_Bool
+e_util_string_to_int(const char *str, int *num, int base)
+{
+   char *end;
+   int errsv;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(num, EINA_FALSE);
+
+   const long sl = strtol(str, &end, base);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((end == str), EINA_FALSE); /* given string is not a decimal number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(('\0' != *end), EINA_FALSE); /* given string has extra characters */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type long */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl > INT_MAX), EINA_FALSE); /* greater than INT_MAX */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl < INT_MIN), EINA_FALSE); /* less than INT_MIN */
+
+   *num = (int)sl;
+
+   return EINA_TRUE;
+}
+
+/* str : string to be parsed
+ * next: return values it contains the address of the first invalid character
+ * num : return value it contains integer value according to the given base
+ */
+E_API Eina_Bool
+e_util_string_to_int_token(const char *str, char **next, int *num, int base)
+{
+   int errsv;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(next, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(num, EINA_FALSE);
+
+   const long sl = strtol(str, next, base);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((*next == str), EINA_FALSE); /* given string is not a decimal number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type long */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl > INT_MAX), EINA_FALSE); /* greater than INT_MAX */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((sl < INT_MIN), EINA_FALSE); /* less than INT_MIN */
+
+   *num = (int)sl;
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_util_string_to_double(const char *str, double *num)
+{
+   char *end;
+   int errsv;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(str, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(num, EINA_FALSE);
+
+   const double sd = strtod(str, &end);
+   errsv = errno;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL((end == str), EINA_FALSE); /* given string is not a floating point number */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(('\0' != *end), EINA_FALSE); /* given string has extra characters */
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(((DBL_MIN == sd || DBL_MAX == sd) && (ERANGE == errsv)), EINA_FALSE); /* out of range of type double */
+
+   *num = sd;
+
+   return EINA_TRUE;
+}
+
 E_API void
 e_util_evas_objects_above_print(Evas_Object *o)
 {
index a06117e..283c6a0 100644 (file)
@@ -54,6 +54,9 @@ E_API void e_util_size_debug_set(Evas_Object *obj, Eina_Bool enable);
 
 E_API char *e_util_string_append_char(char *str, size_t *size, size_t *len, char c);
 E_API char *e_util_string_append_quoted(char *str, size_t *size, size_t *len, const char *src);
+E_API Eina_Bool e_util_string_to_int(const char *str, int *num, int base);
+E_API Eina_Bool e_util_string_to_int_token(const char *str, char **next, int *num, int base);
+E_API Eina_Bool e_util_string_to_double(const char *str, double *num);
 
 E_API void e_util_evas_objects_above_print(Evas_Object *o);
 E_API void e_util_evas_objects_above_print_smart(Evas_Object *o);