summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-09-14 14:09:13 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-14 14:12:56 +0900
commite5e7bd29efd49c4c207da2985610c9ad878d40b0 (patch)
treeefc90e6d99cb545d57f1467d6988779b68845034 /mrbgems/mruby-sprintf
parent6dbf49fdb4a50e006b52fef202f1ec65b8d0e333 (diff)
downloadmruby-e5e7bd29efd49c4c207da2985610c9ad878d40b0.tar.gz
mruby-e5e7bd29efd49c4c207da2985610c9ad878d40b0.zip
sprintf.c: `width` may have been `INT_MAX`.
Now `width` is limited to `INT16_MIN..INT16_MAX`.
Diffstat (limited to 'mrbgems/mruby-sprintf')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 095269be3..8de3a4541 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -692,6 +692,9 @@ retry:
CHECK_FOR_WIDTH(flags);
flags |= FWIDTH;
GETASTER(width);
+ if (width > INT16_MAX || INT16_MIN > width) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "width too big");
+ }
if (width < 0) {
flags |= FMINUS;
width = -width;
@@ -1056,7 +1059,7 @@ retry:
need = BIT_DIGITS(i);
}
if (need > MRB_INT_MAX - ((flags&FPREC) ? prec : 6)) {
- too_big_width:
+ too_big_width_prec:
mrb_raise(mrb, E_ARGUMENT_ERROR,
(width > prec ? "width too big" : "prec too big"));
}
@@ -1064,7 +1067,7 @@ retry:
if ((flags&FWIDTH) && need < width)
need = width;
if (need > MRB_INT_MAX - 20) {
- goto too_big_width;
+ goto too_big_width_prec;
}
need += 20;