diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index 2c3f560f1..b1f515612 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -781,7 +781,7 @@ static size_t ZSTD_decompressSequences( BYTE* const ostart = (BYTE* const)dst; BYTE* op = ostart; BYTE* const oend = ostart + maxDstSize; - size_t errorCode, dumpsLength; + size_t dumpsLength; const BYTE* litPtr = dctx->litPtr; const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8; const BYTE* const litEnd = litPtr + dctx->litSize; @@ -796,11 +796,12 @@ static size_t ZSTD_decompressSequences( const U32 mls = dctx->fParams.mml; /* Build Decoding Tables */ - errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength, + { size_t const errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength, DTableLL, DTableML, DTableOffb, ip, seqSize); - if (ZSTD_isError(errorCode)) return errorCode; - ip += errorCode; + if (ZSTD_isError(errorCode)) return errorCode; + ip += errorCode; + } /* Regen sequences */ if (nbSeq) { @@ -812,8 +813,8 @@ static size_t ZSTD_decompressSequences( seqState.dumps = dumps; seqState.dumpsEnd = dumps + dumpsLength; seqState.prevOffset = REPCODE_STARTVALUE; - errorCode = BIT_initDStream(&(seqState.DStream), ip, iend-ip); - if (ERR_isError(errorCode)) return ERROR(corruption_detected); + { size_t const errorCode = BIT_initDStream(&(seqState.DStream), ip, iend-ip); + if (ERR_isError(errorCode)) return ERROR(corruption_detected); } FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL); FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb); FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML); diff --git a/programs/Makefile b/programs/Makefile index ca2ba99fc..6aca9768e 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -215,19 +215,19 @@ test-zbuff: zbufftest test-zbuff32: zbufftest32 ./zbufftest32 $(ZBUFFTEST) +valgrindTest: VALGRIND = valgrind --leak-check=full --error-exitcode=1 valgrindTest: zstd datagen fuzzer fullbench zbufftest @echo "\n ---- valgrind tests : memory analyzer ----" - valgrind --leak-check=yes --error-exitcode=1 ./datagen -g50M > $(VOID) - ./datagen -g16KB > tmp - valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp -o $(VOID) - ./datagen -g2930KB > tmp - valgrind --leak-check=yes --error-exitcode=1 ./zstd -5 -vf tmp -o tmp2 - valgrind --leak-check=yes --error-exitcode=1 ./zstd -vdf tmp2 -o $(VOID) - ./datagen -g64MB > tmp - valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp -o $(VOID) + $(VALGRIND) ./datagen -g50M > $(VOID) + $(VALGRIND) ./zstd ; if [ $$? -eq 0 ] ; then echo "zstd without argument should have failed"; false; fi + ./datagen -g80 | $(VALGRIND) ./zstd - -c > $(VOID) + ./datagen -g16KB | $(VALGRIND) ./zstd -vf - -o $(VOID) + ./datagen -g2930KB | $(VALGRIND) ./zstd -5 -vf - -o tmp + $(VALGRIND) ./zstd -vdf tmp -o $(VOID) + ./datagen -g64MB | $(VALGRIND) ./zstd -vf - -o $(VOID) @rm tmp - valgrind --leak-check=yes --error-exitcode=1 ./fuzzer -T1mn -t1 - valgrind --leak-check=yes --error-exitcode=1 ./fullbench -i1 - valgrind --leak-check=yes --error-exitcode=1 ./zbufftest -T1mn + $(VALGRIND) ./fuzzer -T1mn -t1 + $(VALGRIND) ./fullbench -i1 + $(VALGRIND) ./zbufftest -T1mn endif diff --git a/programs/zstdcli.c b/programs/zstdcli.c index adfaa793d..86d6bff78 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -167,6 +167,8 @@ static void waitEnter(void) } +#define CLEAN_RETURN(i) { operationResult = (i); goto _end; } + int main(int argCount, const char** argv) { int i, @@ -211,8 +213,8 @@ int main(int argCount, const char** argv) /* long commands (--long-word) */ if (!strcmp(argument, "--decompress")) { decode=1; continue; } if (!strcmp(argument, "--force")) { FIO_overwriteMode(); continue; } - if (!strcmp(argument, "--version")) { displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; } - if (!strcmp(argument, "--help")) { displayOut=stdout; return usage_advanced(programName); } + if (!strcmp(argument, "--version")) { displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0); } + if (!strcmp(argument, "--help")) { displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); } if (!strcmp(argument, "--verbose")) { displayLevel=4; continue; } if (!strcmp(argument, "--quiet")) { displayLevel--; continue; } if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; displayLevel=1; continue; } @@ -244,16 +246,16 @@ int main(int argCount, const char** argv) } dictCLevel = cLevel; if (dictCLevel > ZSTD_maxCLevel()) - return badusage(programName); + CLEAN_RETURN(badusage(programName)); continue; } switch(argument[0]) { /* Display help */ - case 'V': displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; /* Version Only */ + case 'V': displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0); /* Version Only */ case 'H': - case 'h': displayOut=stdout; return usage_advanced(programName); + case 'h': displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); /* Decoding */ case 'd': decode=1; argument++; break; @@ -288,8 +290,7 @@ int main(int argCount, const char** argv) /* Modify Nb Iterations (benchmark only) */ case 'i': - { - int iters= 0; + { U32 iters= 0; argument++; while ((*argument >='0') && (*argument <='9')) iters *= 10, iters += *argument++ - '0'; @@ -299,8 +300,7 @@ int main(int argCount, const char** argv) /* cut input into blocks (benchmark only) */ case 'B': - { - size_t bSize = 0; + { size_t bSize = 0; argument++; while ((*argument >='0') && (*argument <='9')) bSize *= 10, bSize += *argument++ - '0'; @@ -329,11 +329,11 @@ int main(int argCount, const char** argv) case 'p': main_pause=1; argument++; break; /* unknown command */ - default : return badusage(programName); + default : CLEAN_RETURN(badusage(programName)); } } continue; - } + } /* if (argument[0]=='-') */ if (nextEntryIsDictionary) { nextEntryIsDictionary = 0; @@ -389,17 +389,17 @@ int main(int argCount, const char** argv) if(!filenameIdx) filenameIdx=1, filenameTable[0]=stdinmark, outFileName=stdoutmark; /* Check if input/output defined as console; trigger an error in this case */ - if (!strcmp(filenameTable[0], stdinmark) && IS_CONSOLE(stdin) ) return badusage(programName); - if (outFileName && !strcmp(outFileName, stdoutmark) && IS_CONSOLE(stdout) && !forceStdout) return badusage(programName); + if (!strcmp(filenameTable[0], stdinmark) && IS_CONSOLE(stdin) ) CLEAN_RETURN(badusage(programName)); + if (outFileName && !strcmp(outFileName, stdoutmark) && IS_CONSOLE(stdout) && !forceStdout) CLEAN_RETURN(badusage(programName)); /* user-selected output filename, only possible with a single file */ if (outFileName && strcmp(outFileName,stdoutmark) && strcmp(outFileName,nulmark) && (filenameIdx>1)) { DISPLAY("Too many files (%u) on the command line. \n", filenameIdx); - return filenameIdx; + CLEAN_RETURN(filenameIdx); } /* No warning message in pipe mode (stdin + stdout) or multiple mode */ - if (!strcmp(filenameTable[0], stdinmark) && !strcmp(outFileName,stdoutmark) && (displayLevel==2)) displayLevel=1; + if (!strcmp(filenameTable[0], stdinmark) && outFileName && !strcmp(outFileName,stdoutmark) && (displayLevel==2)) displayLevel=1; if ((filenameIdx>1) && (displayLevel==2)) displayLevel=1; /* IO Stream/File */