From 0294661da5b68cd428362fb81513d11471e6a24a Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 14 Jun 2014 17:56:44 +0300 Subject: parsenum: Signedness issues. char can be signedness, and using signedness types is dangerous - it can lead to negative offsets when doing table lookups. We apparently should just ban char usage. --- py/parsenum.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'py/parsenum.c') diff --git a/py/parsenum.c b/py/parsenum.c index 2e513e5159..1c1868ae0a 100644 --- a/py/parsenum.c +++ b/py/parsenum.c @@ -40,8 +40,9 @@ #include #endif -mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) { - const char *restrict top = str + len; +mp_obj_t mp_parse_num_integer(const char *restrict str_, uint len, int base) { + const byte *restrict str = (const byte *)str_; + const byte *restrict top = str + len; bool neg = false; mp_obj_t ret_val; @@ -65,11 +66,11 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) { } // parse optional base prefix - str += mp_parse_num_base(str, top - str, &base); + str += mp_parse_num_base((const char*)str, top - str, &base); // string should be an integer number machine_int_t int_val = 0; - const char *restrict str_val_start = str; + const byte *restrict str_val_start = str; for (; str < top; str++) { // get next digit as a value int dig = *str; @@ -129,9 +130,9 @@ have_ret_val: overflow: // reparse using long int { - const char *s2 = str_val_start; + const char *s2 = (const char*)str_val_start; ret_val = mp_obj_new_int_from_str_len(&s2, top - str_val_start, neg, base); - str = s2; + str = (const byte*)s2; goto have_ret_val; } -- cgit v1.2.3