diff --git a/ChangeLog b/ChangeLog index 27e902b479..aab3c9b597 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Mar 13 09:15:45 2016 Nobuyoshi Nakada + + * numeric.c (rb_fix2str): fix edge case, accidentally generated + wrong Fixnum from LONG_MIN. + Sat Mar 12 09:50:27 2016 Nobuyoshi Nakada * vm_eval.c (rb_f_catch): [DOC] fix malformed RDoc syntax, "+...+" diff --git a/numeric.c b/numeric.c index 1e5f779ae9..c6c0cddf00 100644 --- a/numeric.c +++ b/numeric.c @@ -2905,7 +2905,15 @@ rb_fix2str(VALUE x, int base) return rb_usascii_str_new2("0"); } if (val < 0) { - val = -val; + if (val == LONG_MIN) { + int last = ((int)((val = LONG_MAX) % base) + 1); + *--b = ruby_digitmap[last % base]; + val /= base; + val += last == base; /* carry */ + } + else { + val = -val; + } neg = 1; } do {