tdinger@hiredgun.East.Sun.COM (Tom Dinger - Sun BOS SPA) (03/23/91)
"Fix" perly.fixer for SunOS yacc, and add memory exhaustion test For Perl 4.000 22 March 1991 Tom Dinger (tdinger@East.SUN.COM) The perly.fixer as distributed "almost" works with the YACC output on SunOS (at least one version: 4.0.2 on the Sun386i). The overflow comparison as checked in perly.fixer looks for a "buggy" version of the comparison: it check for ">" when the correct comparison is ">=". This patch fixes the comparison check, by matching either version. In addition, this patch adds out-of-memory checking to the malloc() and realloc() calls; unlikely to occurr for UNIX, but much more likely for limited-memory architectures, like DOS. Incidentally, it seems that in SunOS 4.1 (and later), the YACC parser already uses this same dynamic allocation scheme, and it _has_ the out-of-memory test in it. Apply with the patch program ("patch -p -N < thisfile"). *** orig/perly.fixer Fri Mar 22 20:32:12 1991 --- perly.fixer Fri Mar 22 20:32:52 1991 *************** *** 8,14 **** short[ ]*yys\[ *YYMAXDEPTH *\] *; yyps *= *&yys\[ *-1 *\]; yypv *= *&yyv\[ *-1 *\]; ! if *\( *\+\+yyps *> *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp set `wc -l $tmp` case "$1" in --- 8,14 ---- short[ ]*yys\[ *YYMAXDEPTH *\] *; yyps *= *&yys\[ *-1 *\]; yypv *= *&yyv\[ *-1 *\]; ! if *\( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *\)' $input >$tmp set `wc -l $tmp` case "$1" in *************** *** 31,36 **** --- 31,40 ---- \ if (!yyv) {\ \ yyv = (YYSTYPE*) malloc(yymaxdepth * sizeof(YYSTYPE));\ \ yys = (short*) malloc(yymaxdepth * sizeof(short));\ + \ if ( ! yyv || ! yys ) {\ + \ yyerror( "out of memory" );\ + \ return(1);\ + \ }\ \ maxyyps = &yys[yymaxdepth];\ \ }\ \ yyps = &yys[-1];\ *************** *** 37,52 **** \ yypv = &yyv[-1]; ! /if *( *\+\+yyps *> *&yys\[ *YYMAXDEPTH *\] *)/c\ \ if( ++yyps >= maxyyps ) {\ \ int tv = yypv - yyv;\ \ int ts = yyps - yys;\ \ \ yymaxdepth *= 2;\ ! \ yyv = (YYSTYPE*)realloc((char*)yyv,\ \ yymaxdepth*sizeof(YYSTYPE));\ ! \ yys = (short*)realloc((char*)yys,\ \ yymaxdepth*sizeof(short));\ \ yyps = yys + ts;\ \ yypv = yyv + tv;\ \ maxyyps = &yys[yymaxdepth];\ --- 41,64 ---- \ yypv = &yyv[-1]; ! /if *( *\+\+yyps *>=* *&yys\[ *YYMAXDEPTH *\] *)/c\ \ if( ++yyps >= maxyyps ) {\ + \ YYSTYPE * temp_yyv;\ + \ short * temp_yys;\ \ int tv = yypv - yyv;\ \ int ts = yyps - yys;\ \ \ yymaxdepth *= 2;\ ! \ temp_yyv = (YYSTYPE*)realloc((char*)yyv,\ \ yymaxdepth*sizeof(YYSTYPE));\ ! \ temp_yys = (short*)realloc((char*)yys,\ \ yymaxdepth*sizeof(short));\ + \ if ( ! temp_yyv || ! temp_yys ) {\ + \ yyerror( "yacc stack overflow" );\ + \ return(1);\ + \ }\ + \ yyv = temp_yyv;\ + \ yys = temp_yys;\ \ yyps = yys + ts;\ \ yypv = yyv + tv;\ \ maxyyps = &yys[yymaxdepth];\ Tom Dinger consulting at: TechnoLogics, Inc. Sun Microsystems Internet: tdinger@East.Sun.COM (508)486-8500 (508)671-0521 UUCP: ...!sun!suneast!tdinger