ruby-changes:1688
From: ko1@a...
Date: 22 Aug 2007 10:22:50 +0900
Subject: [ruby-changes:1688] shyouhei - Ruby:r13178 (ruby_1_8_6): * sprintf.c (rb_f_sprintf): more checks for format argument.
shyouhei 2007-08-22 10:22:38 +0900 (Wed, 22 Aug 2007) New Revision: 13178 Modified files: branches/ruby_1_8_6/ChangeLog branches/ruby_1_8_6/sprintf.c branches/ruby_1_8_6/version.h Log: * sprintf.c (rb_f_sprintf): more checks for format argument. [ruby-core:11569], [ruby-core:11570], [ruby-core:11571], [ruby-core:11573] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=13178&r2=13177 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=13178&r2=13177 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/sprintf.c?r1=13178&r2=13177 Index: ruby_1_8_6/ChangeLog =================================================================== --- ruby_1_8_6/ChangeLog (revision 13177) +++ ruby_1_8_6/ChangeLog (revision 13178) @@ -1,3 +1,9 @@ +Wed Aug 22 10:20:32 2007 Nobuyoshi Nakada <nobu@r...> + + * sprintf.c (rb_f_sprintf): more checks for format argument. + [ruby-core:11569], [ruby-core:11570], [ruby-core:11571], + [ruby-core:11573] + Wed Aug 22 10:13:45 2007 pegacorn <subscriber.jp AT gmail.com> * ext/digest/digest.c (rb_digest_instance_update, Index: ruby_1_8_6/version.h =================================================================== --- ruby_1_8_6/version.h (revision 13177) +++ ruby_1_8_6/version.h (revision 13178) @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2007-08-22" #define RUBY_VERSION_CODE 186 #define RUBY_RELEASE_CODE 20070822 -#define RUBY_PATCHLEVEL 65 +#define RUBY_PATCHLEVEL 66 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 Index: ruby_1_8_6/sprintf.c =================================================================== --- ruby_1_8_6/sprintf.c (revision 13177) +++ ruby_1_8_6/sprintf.c (revision 13178) @@ -82,6 +82,7 @@ #define FSPACE 16 #define FWIDTH 32 #define FPREC 64 +#define FPREC0 128 #define CHECK(l) do {\ while (blen + (l) >= bsiz) {\ @@ -110,9 +111,7 @@ #define GETNTHARG(nth) \ ((nth >= argc) ? (rb_raise(rb_eArgError, "too few arguments"), 0) : argv[nth]) -#define GETASTER(val) do { \ - t = p++; \ - n = 0; \ +#define GETNUM(n, val) \ for (; p < end && ISDIGIT(*p); p++) { \ int next_n = 10 * n + (*p - '0'); \ if (next_n / 10 != n) {\ @@ -122,7 +121,12 @@ } \ if (p >= end) { \ rb_raise(rb_eArgError, "malformed format string - %%*[0-9]"); \ - } \ + } + +#define GETASTER(val) do { \ + t = p++; \ + n = 0; \ + GETNUM(n, val); \ if (*p == '$') { \ tmp = GETPOSARG(n); \ } \ @@ -257,6 +261,21 @@ VALUE tmp; VALUE str; +#define CHECK_FOR_WIDTH(f) \ + if ((f) & FWIDTH) { \ + rb_raise(rb_eArgError, "width given twice"); \ + } \ + if ((f) & FPREC0) { \ + rb_raise(rb_eArgError, "width after precision"); \ + } +#define CHECK_FOR_FLAGS(f) \ + if ((f) & FWIDTH) { \ + rb_raise(rb_eArgError, "flag after width"); \ + } \ + if ((f) & FPREC0) { \ + rb_raise(rb_eArgError, "flag after precision"); \ + } + fmt = GETNTHARG(0); if (OBJ_TAINTED(fmt)) tainted = 1; StringValue(fmt); @@ -292,43 +311,40 @@ break; case ' ': + CHECK_FOR_FLAGS(flags); flags |= FSPACE; p++; goto retry; case '#': + CHECK_FOR_FLAGS(flags); flags |= FSHARP; p++; goto retry; case '+': + CHECK_FOR_FLAGS(flags); flags |= FPLUS; p++; goto retry; case '-': + CHECK_FOR_FLAGS(flags); flags |= FMINUS; p++; goto retry; case '0': + CHECK_FOR_FLAGS(flags); flags |= FZERO; p++; goto retry; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + CHECK_FOR_WIDTH(flags); n = 0; - for (; p < end && ISDIGIT(*p); p++) { - int next_n = 10 * n + (*p - '0'); - if (next_n / 10 != n) { - rb_raise(rb_eArgError, "width too big"); - } - n = 10 * n + (*p - '0'); - } - if (p >= end) { - rb_raise(rb_eArgError, "malformed format string - %%[0-9]"); - } + GETNUM(n, width); if (*p == '$') { if (nextvalue != Qundef) { rb_raise(rb_eArgError, "value given twice - %d$", n); @@ -342,10 +358,7 @@ goto retry; case '*': - if (flags & FWIDTH) { - rb_raise(rb_eArgError, "width given twice"); - } - + CHECK_FOR_WIDTH(flags); flags |= FWIDTH; GETASTER(width); if (width < 0) { @@ -356,10 +369,10 @@ goto retry; case '.': - if (flags & FPREC) { + if (flags & FPREC0) { rb_raise(rb_eArgError, "precision given twice"); } - flags |= FPREC; + flags |= FPREC|FPREC0; prec = 0; p++; @@ -372,17 +385,12 @@ goto retry; } - for (; p < end && ISDIGIT(*p); p++) { - prec = 10 * prec + (*p - '0'); - } - if (p >= end) { - rb_raise(rb_eArgError, "malformed format string - %%.[0-9]"); - } + GETNUM(prec, precision); goto retry; case '\n': + case '\0': p--; - case '\0': case '%': if (flags != FNONE) { rb_raise(rb_eArgError, "illegal format character - %%"); @@ -455,7 +463,7 @@ { volatile VALUE val = GETARG(); char fbuf[32], nbuf[64], *s, *t; - char *prefix = 0; + const char *prefix = 0; int sign = 0; char sc = 0; long v = 0; @@ -532,6 +540,7 @@ default: base = 10; break; } + if (!bignum) { if (base == 2) { val = rb_int2big(v); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml