]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fixed #153, reported by @thatsafunnyname
authorYann Collet <yann.collet.73@gmail.com>
Mon, 21 Mar 2016 23:22:50 +0000 (00:22 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Mon, 21 Mar 2016 23:22:50 +0000 (00:22 +0100)
programs/Makefile
programs/zstdcli.c

index ca2ba99fc7ede9e20c6d38cfd145fa4eb5344f33..6aca9768ef7f37095e8ac8db198be555492e6051 100644 (file)
@@ -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
index adfaa793dc280ef33167f2a51d1497a083667a1b..86d6bff788065bfe9b887a8faa0115ab7cec064a 100644 (file)
@@ -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 */