From: Przemyslaw Skibinski Date: Wed, 30 Nov 2016 12:34:21 +0000 (+0100) Subject: fileio.c: detect .gz files X-Git-Tag: v1.1.2~46^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e14675df2550f9850d62ab8f5e0b66554afe7d9;p=thirdparty%2Fzstd.git fileio.c: detect .gz files --- diff --git a/programs/fileio.c b/programs/fileio.c index 71593ac90..a11f92868 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -74,6 +74,7 @@ #define MAX_DICT_SIZE (8 MB) /* protection against large input (attack scenario) */ #define FNSPACE 30 +#define GZ_EXTENSION ".gz" /*-************************************* @@ -658,11 +659,20 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName) FILE* const dstFile = ress.dstFile; FILE* srcFile; unsigned readSomething = 0; + size_t const suffixSize = strlen(GZ_EXTENSION); + size_t const sfnSize = strlen(srcFileName); + const char* const suffixPtr = srcFileName + sfnSize - suffixSize; + + if (sfnSize > suffixSize && strcmp(suffixPtr, GZ_EXTENSION) == 0) { + DISPLAYLEVEL(1, "zstd: %s: gz file cannot be uncompressed -- ignored \n", srcFileName); + return 1; + } if (UTIL_isDirectory(srcFileName)) { DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName); return 1; } + srcFile = FIO_openSrcFile(srcFileName); if (srcFile==0) return 1; @@ -763,6 +773,7 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles if (fclose(ress.dstFile)) EXM_THROW(72, "Write error : cannot properly close stdout"); } else { size_t const suffixSize = strlen(suffix); + size_t const gzSuffixSize = strlen(GZ_EXTENSION); size_t dfnSize = FNSPACE; unsigned u; char* dstFileName = (char*)malloc(FNSPACE); @@ -771,6 +782,7 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles const char* const srcFileName = srcNamesTable[u]; size_t const sfnSize = strlen(srcFileName); const char* const suffixPtr = srcFileName + sfnSize - suffixSize; + const char* const gzSuffixPtr = srcFileName + sfnSize - gzSuffixSize; if (dfnSize+suffixSize <= sfnSize+1) { free(dstFileName); dfnSize = sfnSize + 20; @@ -778,12 +790,18 @@ int FIO_decompressMultipleFilenames(const char** srcNamesTable, unsigned nbFiles if (dstFileName==NULL) EXM_THROW(74, "not enough memory for dstFileName"); } if (sfnSize <= suffixSize || strcmp(suffixPtr, suffix) != 0) { - DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%4s expected) -- ignored \n", srcFileName, suffix); - skippedFiles++; - continue; + if (sfnSize <= gzSuffixSize || strcmp(gzSuffixPtr, GZ_EXTENSION) != 0) { + DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%4s expected) -- ignored \n", srcFileName, suffix); + skippedFiles++; + continue; + } else { + memcpy(dstFileName, srcFileName, sfnSize - gzSuffixSize); + dstFileName[sfnSize-gzSuffixSize] = '\0'; + } + } else { + memcpy(dstFileName, srcFileName, sfnSize - suffixSize); + dstFileName[sfnSize-suffixSize] = '\0'; } - memcpy(dstFileName, srcFileName, sfnSize - suffixSize); - dstFileName[sfnSize-suffixSize] = '\0'; missingFiles += FIO_decompressDstFile(ress, dstFileName, srcFileName); }