/ Check-in [36e54cd8]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Faster parser stack overflow detection.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256:36e54cd8b1fb374fd41e3e09b34b86e34327bf07c9e4bfec58382163c5c5d279
User & Date: drh 2017-06-28 15:01:35
References
2017-07-04
12:50
Fix a problem in the lempar.c Lemon template for YYSTACKDEPTH<=0 introduced by check-in [36e54cd8b1fb37] check-in: 268a40f4 user: drh tags: trunk
Context
2017-06-28
15:17
Fix harmless compiler warnings in the CSV extension. check-in: f02a5459 user: drh tags: trunk
15:01
Faster parser stack overflow detection. check-in: 36e54cd8 user: drh tags: trunk
14:26
Minor tweak to the SQL grammar to make the parser tables a few bytes smaller. check-in: cc4810b2 user: drh tags: trunk
Changes
Hide Diffs Side-by-Side Diffs Ignore Whitespace Patch

Changes to tool/lempar.c.

   217    217     ParseARG_SDECL                /* A place to hold %extra_argument */
   218    218   #if YYSTACKDEPTH<=0
   219    219     int yystksz;                  /* Current side of the stack */
   220    220     yyStackEntry *yystack;        /* The parser's stack */
   221    221     yyStackEntry yystk0;          /* First stack entry */
   222    222   #else
   223    223     yyStackEntry yystack[YYSTACKDEPTH];  /* The parser's stack */
          224  +  yyStackEntry *yystackEnd;            /* Last entry in the stack */
   224    225   #endif
   225    226   };
   226    227   typedef struct yyParser yyParser;
   227    228   
   228    229   #ifndef NDEBUG
   229    230   #include <stdio.h>
   230    231   static FILE *yyTraceFILE = 0;
................................................................................
   334    335   #endif
   335    336   #ifndef YYNOERRORRECOVERY
   336    337     pParser->yyerrcnt = -1;
   337    338   #endif
   338    339     pParser->yytos = pParser->yystack;
   339    340     pParser->yystack[0].stateno = 0;
   340    341     pParser->yystack[0].major = 0;
          342  +  pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1];
   341    343   }
   342    344   
   343    345   #ifndef Parse_ENGINEALWAYSONSTACK
   344    346   /* 
   345    347   ** This function allocates a new parser.
   346    348   ** The only argument is a pointer to a function which works like
   347    349   ** malloc.
................................................................................
   603    605   #ifdef YYTRACKMAXSTACKDEPTH
   604    606     if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
   605    607       yypParser->yyhwm++;
   606    608       assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
   607    609     }
   608    610   #endif
   609    611   #if YYSTACKDEPTH>0 
   610         -  if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){
          612  +  if( yypParser->yytos>yypParser->yystackEnd ){
   611    613       yypParser->yytos--;
   612    614       yyStackOverflow(yypParser);
   613    615       return;
   614    616     }
   615    617   #else
   616    618     if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
   617    619       if( yyGrowStack(yypParser) ){
................................................................................
   672    674   #ifdef YYTRACKMAXSTACKDEPTH
   673    675       if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
   674    676         yypParser->yyhwm++;
   675    677         assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack));
   676    678       }
   677    679   #endif
   678    680   #if YYSTACKDEPTH>0 
   679         -    if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH-1] ){
          681  +    if( yypParser->yytos>=yypParser->yystackEnd ){
   680    682         yyStackOverflow(yypParser);
   681    683         return;
   682    684       }
   683    685   #else
   684    686       if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
   685    687         if( yyGrowStack(yypParser) ){
   686    688           yyStackOverflow(yypParser);