From 5a854af006bf2ab28133c4cf3ec3d30c53feb73a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 22 Mar 2016 00:22:50 +0100 Subject: [PATCH] Fixed #153, reported by @thatsafunnyname --- programs/Makefile | 22 +++++++++++----------- programs/zstdcli.c | 30 +++++++++++++++--------------- 2 files changed, 26 insertions(+), 26 deletions(-) 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 */