ruby-changes:1683
From: ko1@a...
Date: 22 Aug 2007 10:13:46 +0900
Subject: [ruby-changes:1683] shyouhei - Ruby:r13174 (ruby_1_8_6): * bignum.c (rb_cstr_to_inum): check leading non-digits.
shyouhei 2007-08-22 10:13:26 +0900 (Wed, 22 Aug 2007) New Revision: 13174 Modified files: branches/ruby_1_8_6/ChangeLog branches/ruby_1_8_6/bignum.c branches/ruby_1_8_6/version.h Log: * bignum.c (rb_cstr_to_inum): check leading non-digits. [ruby-core:11691] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=13174&r2=13173 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=13174&r2=13173 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/bignum.c?r1=13174&r2=13173 Index: ruby_1_8_6/ChangeLog =================================================================== --- ruby_1_8_6/ChangeLog (revision 13173) +++ ruby_1_8_6/ChangeLog (revision 13174) @@ -1,3 +1,8 @@ +Wed Aug 22 10:11:59 2007 Nobuyoshi Nakada <nobu@r...> + + * bignum.c (rb_cstr_to_inum): check leading non-digits. + [ruby-core:11691] + Wed Aug 22 10:07:48 2007 Nobuyoshi Nakada <nobu@r...> * bignum.c (rb_big_neg): SIGNED_VALUE isn't in 1.8. Index: ruby_1_8_6/version.h =================================================================== --- ruby_1_8_6/version.h (revision 13173) +++ ruby_1_8_6/version.h (revision 13174) @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2007-08-22" #define RUBY_VERSION_CODE 186 #define RUBY_RELEASE_CODE 20070822 -#define RUBY_PATCHLEVEL 63 +#define RUBY_PATCHLEVEL 64 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 Index: ruby_1_8_6/bignum.c =================================================================== --- ruby_1_8_6/bignum.c (revision 13173) +++ ruby_1_8_6/bignum.c (revision 13174) @@ -346,6 +346,13 @@ VALUE z; BDIGIT *zds; +#define conv_digit(c) \ + (!ISASCII(c) ? -1 : \ + isdigit(c) ? ((c) - '0') : \ + islower(c) ? ((c) - 'a' + 10) : \ + isupper(c) ? ((c) - 'A' + 10) : \ + -1) + if (!str) { if (badcheck) goto bad; return INT2FIX(0); @@ -438,8 +445,14 @@ } if (*str == '0') { /* squeeze preceeding 0s */ while (*++str == '0'); - --str; + if (!*str) --str; } + c = *str; + c = conv_digit(c); + if (c < 0 || c >= base) { + if (badcheck) goto bad; + return INT2FIX(0); + } len *= strlen(str)*sizeof(char); if (len <= (sizeof(VALUE)*CHAR_BIT)) { @@ -472,7 +485,7 @@ z = bignew(len, sign); zds = BDIGITS(z); for (i=len;i--;) zds[i]=0; - while (c = *str++) { + while ((c = *str++) != 0) { if (c == '_') { if (badcheck) { if (nondigit) goto bad; @@ -480,21 +493,9 @@ } continue; } - else if (!ISASCII(c)) { + else if ((c = conv_digit(c)) < 0) { break; } - else if (isdigit(c)) { - c -= '0'; - } - else if (islower(c)) { - c -= 'a' - 10; - } - else if (isupper(c)) { - c -= 'A' - 10; - } - else { - break; - } if (c >= base) break; nondigit = 0; i = 0; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml