ami pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=475ae7ef1bf6b44a5d4c3abba21a4a2fa2d565f5
commit 475ae7ef1bf6b44a5d4c3abba21a4a2fa2d565f5 Author: Amitesh Singh <amitesh...@samsung.com> Date: Fri Nov 24 14:56:10 2017 +0900 Efl.Ui.Format: add string format checking for user input --- src/lib/efl/interfaces/efl_ui_format.c | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/lib/efl/interfaces/efl_ui_format.c b/src/lib/efl/interfaces/efl_ui_format.c index b55cda074d..390a45173b 100644 --- a/src/lib/efl/interfaces/efl_ui_format.c +++ b/src/lib/efl/interfaces/efl_ui_format.c @@ -1,16 +1,92 @@ #include "config.h" #include "Efl.h" +#define ERR(...) EINA_LOG_DOM_ERR(EINA_LOG_DOMAIN_DEFAULT, __VA_ARGS__) + typedef struct { const char *template; } Efl_Ui_Format_Data; +static Eina_Bool +_is_valid_digit(char x) +{ + return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE; +} + +static int +_format_string_check(const char *fmt) +{ + const char *itr = NULL; + const char *start = NULL; + Eina_Bool found = EINA_FALSE; + int ret_type = 0; + + start = strchr(fmt, '%'); + if (!start) return 0; + + while (start) + { + if (found && start[1] != '%') + { + return 0; + } + + if (start[1] != '%' && !found) + { + found = EINA_TRUE; + for (itr = start + 1; *itr != '\0'; itr++) + { + if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') || + (*itr == 'o') || (*itr == 'x') || (*itr == 'X')) + { + ret_type = 1; //int + break; + } + else if ((*itr == 'f') || (*itr == 'F')) + { + ret_type = 2; //double + break; + } + else if (_is_valid_digit(*itr)) + { + continue; + } + else + { + return 0; + } + } + } + start = strchr(start + 2, '%'); + } + + return ret_type; +} + static void _default_format_cb(void *data, Eina_Strbuf *str, const Eina_Value value) { const Eina_Value_Type *type = eina_value_type_get(&value); Efl_Ui_Format_Data *sd = data; + int format_check_result; + + if (type == EINA_VALUE_TYPE_TM) + { + struct tm v; + eina_value_get(&value, &v); + eina_strbuf_append_strftime(str, sd->template, &v); + + return; + } + + format_check_result = _format_string_check(sd->template); + + if (format_check_result == 0) + { + ERR("Wrong String Format: %s\n", sd->template); + return; + } if (type == EINA_VALUE_TYPE_DOUBLE) { --