summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-14 17:56:44 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-14 18:02:21 +0300
commit0294661da5b68cd428362fb81513d11471e6a24a (patch)
tree4f39fda5bfc2857cdc16fcad0cf6b35cf6ce74d6 /py
parent812025bd8317d520006dd71ab6404edb6df29352 (diff)
downloadmicropython-0294661da5b68cd428362fb81513d11471e6a24a.tar.gz
micropython-0294661da5b68cd428362fb81513d11471e6a24a.zip
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.
Diffstat (limited to 'py')
-rw-r--r--py/parsenum.c13
-rw-r--r--py/parsenumbase.c4
2 files changed, 9 insertions, 8 deletions
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 <math.h>
#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;
}
diff --git a/py/parsenumbase.c b/py/parsenumbase.c
index 0057e467e5..ce140655bd 100644
--- a/py/parsenumbase.c
+++ b/py/parsenumbase.c
@@ -31,7 +31,7 @@
// find real radix base, and strip preceding '0x', '0o' and '0b'
// puts base in *base, and returns number of bytes to skip the prefix
int mp_parse_num_base(const char *str, uint len, int *base) {
- const char *p = str;
+ const byte *p = (const byte*)str;
int c = *(p++);
if ((*base == 0 || *base == 16) && c == '0') {
c = *(p++);
@@ -63,6 +63,6 @@ int mp_parse_num_base(const char *str, uint len, int *base) {
}
p--;
}
- return p - str;
+ return p - (const byte*)str;
}