diff options
author | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-25 19:51:38 +0000 |
---|---|---|
committer | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-25 19:51:38 +0000 |
commit | bab2e6cfdf341baa65533be655563d5cb819f6ba (patch) | |
tree | 5a3a274aa3c4f18d1d13309699c01174c4466a82 /ext/syck/bytecode.c | |
parent | 3d0d2d5ff1a75dcf32f455f306079f139269f280 (diff) |
* ext/syck/token.c: removed YYTOKTMP references which
were causing buffer overflows on large block scalars,
comments, quoted scalars and plain scalars.
* ext/syck/rubyext.c: dynamic changing of buffer size.
* ext/syck/syck.h: default buffer size of 4k.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5032 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/bytecode.c')
-rw-r--r-- | ext/syck/bytecode.c | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/ext/syck/bytecode.c b/ext/syck/bytecode.c index 848f69f918..df15658a73 100644 --- a/ext/syck/bytecode.c +++ b/ext/syck/bytecode.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.5 on Fri Oct 17 12:13:58 2003 */ +/* Generated by re2c 0.5 on Sun Nov 23 14:51:02 2003 */ #line 1 "bytecode.re" /* * bytecode.re @@ -39,6 +39,11 @@ char *get_inline( SyckParser *parser ); #define YYPOS(n) YYCURSOR = YYTOKEN + n /* + * Track line numbers + */ +#define CHK_NL(ptr) if ( *( ptr - 1 ) == '\n' && ptr > YYLINECTPTR ) { YYLINEPTR = ptr; YYLINE++; YYLINECTPTR = YYLINEPTR; } + +/* * I like seeing the level operations as macros... */ #define ADD_LEVEL(len, status) syck_parser_add_level( parser, len, status ) @@ -144,7 +149,7 @@ sycklex_bytecode_utf8( YYSTYPE *sycklval, SyckParser *parser ) return t; } -#line 168 +#line 173 lvl = CURRENT_LEVEL(); @@ -182,7 +187,7 @@ yy3: yyaccept = 0; default: goto yy4; } yy4: -#line 194 +#line 200 { YYPOS(0); goto Document; } @@ -190,9 +195,10 @@ yy5: yych = *++YYCURSOR; goto yy4; yy6: yych = *++YYCURSOR; yy7: -#line 182 +#line 187 { if ( lvl->status == syck_lvl_header ) { + CHK_NL(YYCURSOR); goto Directive; } else @@ -208,10 +214,8 @@ yy8: yych = *++YYCURSOR; default: goto yy2; } } -#line 198 - +#line 204 - lvl->status = syck_lvl_doc; Document: { @@ -279,21 +283,22 @@ yy16: yych = *++YYCURSOR; } yy17: yych = *++YYCURSOR; yy18: -#line 282 +#line 289 { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); goto Scalar; } yy19: yych = *++YYCURSOR; yy20: -#line 286 +#line 293 { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open); sycklval->name = get_inline( parser ); syck_hdlr_remove_anchor( parser, sycklval->name ); + CHK_NL(YYCURSOR); return YAML_ANCHOR; } yy21: yych = *++YYCURSOR; yy22: -#line 292 +#line 300 { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); sycklval->name = get_inline( parser ); POP_LEVEL(); @@ -302,10 +307,11 @@ yy22: } yy23: yych = *++YYCURSOR; yy24: -#line 299 +#line 307 { char *qstr; ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open); qstr = get_inline( parser ); + CHK_NL(YYCURSOR); if ( qstr[0] == '!' ) { int qidx = strlen( qstr ); @@ -363,12 +369,13 @@ yy24: } yy25: yych = *++YYCURSOR; yy26: -#line 358 +#line 367 { goto Comment; } yy27: yych = *++YYCURSOR; yy28: -#line 360 - { if ( lvl->status == syck_lvl_seq ) +#line 369 + { CHK_NL(YYCURSOR); + if ( lvl->status == syck_lvl_seq ) { return YAML_INDENT; } @@ -386,14 +393,14 @@ yy29: yych = *++YYCURSOR; } yy30: yych = *++YYCURSOR; yy31: -#line 372 +#line 382 { ENSURE_YAML_IEND(lvl, -1); YYPOS(0); return 0; } yy32: yych = *++YYCURSOR; yy33: -#line 247 +#line 253 { if ( lvl->status == syck_lvl_seq && lvl->ncount == 0 ) { lvl->ncount++; @@ -426,6 +433,7 @@ yy33: FORCE_NEXT_TOKEN(YAML_INDENT); } } + CHK_NL(YYCURSOR); return YAML_IEND; } yy34: yych = *++YYCURSOR; @@ -435,13 +443,14 @@ yy34: yych = *++YYCURSOR; } yy35: yych = *++YYCURSOR; yy36: -#line 233 +#line 238 { int complex = 0; if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) ) { complex = 1; } ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_seq); + CHK_NL(YYCURSOR); if ( complex ) { FORCE_NEXT_TOKEN( YAML_IOPEN ); @@ -456,13 +465,14 @@ yy37: yych = *++YYCURSOR; } yy38: yych = *++YYCURSOR; yy39: -#line 219 +#line 223 { int complex = 0; if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) ) { complex = 1; } ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_map); + CHK_NL(YYCURSOR); if ( complex ) { FORCE_NEXT_TOKEN( YAML_IOPEN ); @@ -477,7 +487,7 @@ yy40: yych = *++YYCURSOR; } yy41: yych = *++YYCURSOR; yy42: -#line 214 +#line 218 { ENSURE_YAML_IEND(lvl, -1); YYPOS(0); return 0; @@ -493,7 +503,7 @@ yy44: yych = *++YYCURSOR; default: goto yy11; } } -#line 377 +#line 387 } @@ -600,7 +610,7 @@ yy48: yyaccept = 0; default: goto yy49; } yy49: -#line 389 +#line 400 { YYCURSOR = YYTOKTMP; return YAML_DOCSEP; } @@ -850,15 +860,16 @@ yy55: switch(yych){ } yy56: yych = *++YYCURSOR; yy57: -#line 387 - { goto Directive; } +#line 397 + { CHK_NL(YYCURSOR); + goto Directive; } yy58: yych = *++YYCURSOR; switch(yych){ case '\n': goto yy56; default: goto yy47; } } -#line 392 +#line 403 } @@ -883,22 +894,23 @@ yy59: } yy61:yy62: yych = *++YYCURSOR; yy63: -#line 402 - { goto Document; } +#line 413 + { CHK_NL(YYCURSOR); + goto Document; } yy64: yych = *++YYCURSOR; switch(yych){ case '\n': goto yy67; default: goto yy65; } yy65: -#line 404 +#line 416 { goto Comment; } yy66: yych = *++YYCURSOR; goto yy65; yy67: yych = *++YYCURSOR; goto yy63; } -#line 406 +#line 418 } @@ -937,7 +949,7 @@ yy70: yych = *++YYCURSOR; default: goto yy71; } yy71: -#line 447 +#line 462 { YYCURSOR = tok; goto ScalarEnd; } @@ -947,13 +959,13 @@ yy72: yych = *++YYCURSOR; default: goto yy73; } yy73: -#line 455 +#line 470 { CAT(str, cap, idx, tok[0]); goto Scalar2; } yy74: yych = *++YYCURSOR; yy75: -#line 451 +#line 466 { YYCURSOR = tok; goto ScalarEnd; } @@ -968,8 +980,9 @@ yy77: yych = *++YYCURSOR; } yy78: yych = *++YYCURSOR; yy79: -#line 424 - { goto Scalar2; } +#line 436 + { CHK_NL(tok+1); + goto Scalar2; } yy80: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -987,8 +1000,9 @@ yy81: switch(yych){ default: goto yy82; } yy82: -#line 426 - { if ( tok + 2 < YYCURSOR ) +#line 439 + { CHK_NL(tok+1); + if ( tok + 2 < YYCURSOR ) { char *count = tok + 2; int total = strtod( count, NULL ); @@ -1006,12 +1020,13 @@ yy82: } yy83: yych = *++YYCURSOR; yy84: -#line 443 - { CAT(str, cap, idx, '\0'); +#line 457 + { CHK_NL(tok+1); + CAT(str, cap, idx, '\0'); goto Scalar2; } } -#line 459 +#line 474 ScalarEnd: @@ -1061,21 +1076,22 @@ yy85: } yy87: yych = *++YYCURSOR; yy88: -#line 494 - { return str; } +#line 509 + { CHK_NL(YYCURSOR); + return str; } yy89: yych = *++YYCURSOR; switch(yych){ case '\n': goto yy94; default: goto yy90; } yy90: -#line 500 +#line 516 { CAT(str, cap, idx, tok[0]); goto Inline; } yy91: yych = *++YYCURSOR; yy92: -#line 496 +#line 512 { YYCURSOR = tok; return str; } @@ -1084,7 +1100,7 @@ yy93: yych = *++YYCURSOR; yy94: yych = *++YYCURSOR; goto yy88; } -#line 504 +#line 520 } |