diff --git a/ChangeLog.txt b/ChangeLog.txt index d58d8f0359..237655e983 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,13 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2016-01-19 11:47 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/compiler/cmdcheck.c + ! fixed parsing some parameters taken from environment and + delimited with spaces + ! fixed potential memory leak when some parameters were + repeated. + 2016-01-18 12:37 UTC+0100 Maurilio Longo (maurilio.longo@libero.it) + tests/longfile.prg + create a .dbf file bigger than 2GB and test index operations on it. diff --git a/src/compiler/cmdcheck.c b/src/compiler/cmdcheck.c index 710966fca0..de7a415d2e 100644 --- a/src/compiler/cmdcheck.c +++ b/src/compiler/cmdcheck.c @@ -145,15 +145,19 @@ static const char * hb_compChkOptionFName( const char * szSwitch, { HB_SIZE nLen = hb_compChkOptionLen( szSwitch, fEnv ); - if( szSwitch[ nLen ] != '\0' ) + if( nLen > 0 ) { - char * szVal = hb_strndup( szSwitch, nLen ); - *pResult = hb_fsFNameSplit( szVal ); - hb_xfree( szVal ); + if( *pResult ) + hb_xfree( *pResult ); + if( szSwitch[ nLen ] != '\0' ) + { + char * szVal = hb_strndup( szSwitch, nLen ); + *pResult = hb_fsFNameSplit( szVal ); + hb_xfree( szVal ); + } + else + *pResult = hb_fsFNameSplit( szSwitch ); } - else - *pResult = hb_fsFNameSplit( szSwitch ); - return szSwitch + nLen; } @@ -260,12 +264,6 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, { switch( szSwPtr[ 2 ] ) { - case '0': - ++szSwPtr; - case '\0': - szSwPtr += 2; - HB_COMP_PARAM->iExitLevel = HB_EXITLEVEL_DEFAULT; - break; case '1': szSwPtr += 3; HB_COMP_PARAM->iExitLevel = HB_EXITLEVEL_SETEXIT; @@ -273,6 +271,14 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, case '2': szSwPtr += 3; HB_COMP_PARAM->iExitLevel = HB_EXITLEVEL_DELTARGET; + break; + case '0': + ++szSwPtr; + /* no break; */ + default: + szSwPtr += 2; + HB_COMP_PARAM->iExitLevel = HB_EXITLEVEL_DEFAULT; + break; } } break; @@ -361,11 +367,6 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, szSwPtr += 2; switch( *szSwPtr ) { - case '0': - ++szSwPtr; - case '\0': - HB_COMP_PARAM->iGenCOutput = HB_COMPGENC_COMPACT; - break; case '1': ++szSwPtr; HB_COMP_PARAM->iGenCOutput = HB_COMPGENC_NORMAL; @@ -377,6 +378,13 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, case '3': ++szSwPtr; HB_COMP_PARAM->iGenCOutput = HB_COMPGENC_REALCODE; + break; + case '0': + ++szSwPtr; + /* no break; */ + default: + HB_COMP_PARAM->iGenCOutput = HB_COMPGENC_COMPACT; + break; } break; @@ -409,14 +417,16 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, szSwPtr += 2; switch( *szSwPtr ) { - case '0': - ++szSwPtr; - case '\0': - HB_COMP_PARAM->iErrorFmt = HB_ERRORFMT_CLIPPER; - break; case '1': ++szSwPtr; HB_COMP_PARAM->iErrorFmt = HB_ERRORFMT_IDE; + break; + case '0': + ++szSwPtr; + /* no break; */ + default: + HB_COMP_PARAM->iErrorFmt = HB_ERRORFMT_CLIPPER; + break; } break; @@ -619,15 +629,17 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, HB_COMP_PARAM->iStartProc = 0; ++szSwPtr; break; - case '0': - case '1': - ++szSwPtr; - case '\0': - HB_COMP_PARAM->iStartProc = 1; - break; case '2': HB_COMP_PARAM->iStartProc = 2; ++szSwPtr; + break; + case '0': + case '1': + ++szSwPtr; + /* no break; */ + default: + HB_COMP_PARAM->iStartProc = 1; + break; } break; @@ -711,9 +723,6 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, ++szSwPtr; switch( *szSwPtr ) { - case '\0': - HB_COMP_PARAM->iSyntaxCheckOnly = 1; - break; case '-': HB_COMP_PARAM->iSyntaxCheckOnly = 0; ++szSwPtr; @@ -722,6 +731,10 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, case 'M': HB_COMP_PARAM->iSyntaxCheckOnly = 2; ++szSwPtr; + break; + default: + HB_COMP_PARAM->iSyntaxCheckOnly = 1; + break; } break; @@ -748,7 +761,7 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, /* extended definitions file: -u+ */ if( *szSwPtr == '+' ) { - if( szSwPtr[ 1 ] ) + if( szSwPtr[ 1 ] && hb_compChkOptionLen( szSwPtr + 1, fEnv ) > 0 ) { HB_COMP_PARAM->szStdChExt = ( char ** ) ( HB_COMP_PARAM->iStdChExt == 0 ? @@ -783,12 +796,10 @@ static const char * hb_compChkParseSwitch( HB_COMP_DECL, const char * szSwitch, case 'W': ++szSwPtr; HB_COMP_PARAM->iWarnings = 1; - if( *szSwPtr ) + if( *szSwPtr >= '0' && *szSwPtr <= '3' ) { HB_COMP_PARAM->iWarnings = *szSwPtr - '0'; - if( HB_COMP_PARAM->iWarnings >= 0 && - HB_COMP_PARAM->iWarnings <= 3 ) - ++szSwPtr; + ++szSwPtr; } break;