mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #2455 from cremno/readint_mrb_int-check-base
invalid base shouldn't silently fail
This commit is contained in:
+14
-15
@@ -1095,6 +1095,7 @@ readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_boo
|
||||
mrb_int result = 0;
|
||||
int n;
|
||||
|
||||
mrb_assert(base >= 2 && base <= 36);
|
||||
if (*p == '+') p++;
|
||||
while (p < e) {
|
||||
char c = *p;
|
||||
@@ -1108,23 +1109,21 @@ readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_boo
|
||||
codegen_error(s, "malformed readint input");
|
||||
}
|
||||
|
||||
if(base > 0) {
|
||||
if (neg) {
|
||||
if ((MRB_INT_MIN + n)/base > result) {
|
||||
*overflow = TRUE;
|
||||
return 0;
|
||||
}
|
||||
result *= base;
|
||||
result -= n;
|
||||
if (neg) {
|
||||
if ((MRB_INT_MIN + n)/base > result) {
|
||||
*overflow = TRUE;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
if ((MRB_INT_MAX - n)/base < result) {
|
||||
*overflow = TRUE;
|
||||
return 0;
|
||||
}
|
||||
result *= base;
|
||||
result += n;
|
||||
result *= base;
|
||||
result -= n;
|
||||
}
|
||||
else {
|
||||
if ((MRB_INT_MAX - n)/base < result) {
|
||||
*overflow = TRUE;
|
||||
return 0;
|
||||
}
|
||||
result *= base;
|
||||
result += n;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user