|
|
@@ -53,16 +53,16 @@ void ZipTest::testSkipSingleFile()
|
|
|
ZipLocalFileHeader hdr(inp, false, skip);
|
|
|
assert (ZipCommon::HS_FAT == hdr.getHostSystem());
|
|
|
int major = hdr.getMajorVersionNumber();
|
|
|
- int minor = hdr.getMinorVersionNumber();
|
|
|
+ int POCO_UNUSED minor = hdr.getMinorVersionNumber();
|
|
|
assert (major <= 2);
|
|
|
std::size_t hdrSize = hdr.getHeaderSize();
|
|
|
assert (hdrSize > 30);
|
|
|
- ZipCommon::CompressionMethod cm = hdr.getCompressionMethod();
|
|
|
+ ZipCommon::CompressionMethod POCO_UNUSED cm = hdr.getCompressionMethod();
|
|
|
assert (!hdr.isEncrypted());
|
|
|
Poco::DateTime aDate = hdr.lastModifiedAt();
|
|
|
- Poco::UInt64 cS = hdr.getCompressedSize();
|
|
|
- Poco::UInt64 uS = hdr.getUncompressedSize();
|
|
|
- const std::string& fileName = hdr.getFileName();
|
|
|
+ Poco::UInt64 POCO_UNUSED cS = hdr.getCompressedSize();
|
|
|
+ Poco::UInt64 POCO_UNUSED uS = hdr.getUncompressedSize();
|
|
|
+ const std::string& POCO_UNUSED fileName = hdr.getFileName();
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -101,7 +101,7 @@ void ZipTest::testCrcAndSizeAfterData()
|
|
|
std::string testFile = getTestFile("data", "data.zip");
|
|
|
std::ifstream inp(testFile.c_str(), std::ios::binary);
|
|
|
assert (inp.good());
|
|
|
- Decompress dec(inp, Poco::Path());
|
|
|
+ Decompress dec(inp, Poco::Path::temp());
|
|
|
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
dec.decompressAllFiles();
|
|
|
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
@@ -125,7 +125,7 @@ void ZipTest::testCrcAndSizeAfterDataWithArchive()
|
|
|
Poco::Path path(it->second.getFileName());
|
|
|
if (path.isFile())
|
|
|
{
|
|
|
- std::ofstream os("test.dat");
|
|
|
+ std::ofstream os(Poco::Path::temp() + "test.dat");
|
|
|
Poco::StreamCopier::copyStream(zipis,os);
|
|
|
}
|
|
|
}
|
|
|
@@ -162,7 +162,7 @@ void ZipTest::testDecompress()
|
|
|
std::string testFile = getTestFile("data", "test.zip");
|
|
|
std::ifstream inp(testFile.c_str(), std::ios::binary);
|
|
|
assert (inp.good());
|
|
|
- Decompress dec(inp, Poco::Path());
|
|
|
+ Decompress dec(inp, Poco::Path::temp());
|
|
|
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
dec.decompressAllFiles();
|
|
|
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
@@ -176,7 +176,35 @@ void ZipTest::testDecompressFlat()
|
|
|
std::string testFile = getTestFile("data", "test.zip");
|
|
|
std::ifstream inp(testFile.c_str(), std::ios::binary);
|
|
|
assert (inp.good());
|
|
|
- Decompress dec(inp, Poco::Path(), true);
|
|
|
+ Decompress dec(inp, Poco::Path::temp(), true);
|
|
|
+ dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
+ dec.decompressAllFiles();
|
|
|
+ dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
+ assert (_errCnt == 0);
|
|
|
+ assert (!dec.mapping().empty());
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void ZipTest::testDecompressVuln()
|
|
|
+{
|
|
|
+ std::string testFile = getTestFile("data", "vuln.zip");
|
|
|
+ std::ifstream inp(testFile.c_str(), std::ios::binary);
|
|
|
+ assert(inp.good());
|
|
|
+ Decompress dec(inp, Poco::Path::temp());
|
|
|
+ dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
+ dec.decompressAllFiles();
|
|
|
+ dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
+ assert (_errCnt == 1);
|
|
|
+ assert (dec.mapping().empty());
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void ZipTest::testDecompressFlatVuln()
|
|
|
+{
|
|
|
+ std::string testFile = getTestFile("data", "vuln.zip");
|
|
|
+ std::ifstream inp(testFile.c_str(), std::ios::binary);
|
|
|
+ assert(inp.good());
|
|
|
+ Decompress dec(inp, Poco::Path::temp(), true);
|
|
|
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
dec.decompressAllFiles();
|
|
|
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
|
|
|
@@ -197,8 +225,8 @@ void ZipTest::verifyDataFile(const std::string& path, Poco::UInt64 size)
|
|
|
std::memset(buffer2.begin(), 0, buffer2.size());
|
|
|
Poco::UInt64 bytesToRead = std::min(size, static_cast<Poco::UInt64>(buffer2.size()));
|
|
|
in.read(buffer2.begin(), bytesToRead);
|
|
|
- assert(!in.fail() );
|
|
|
- assert(std::memcmp(buffer1.begin(), buffer2.begin(), static_cast<std::size_t>(bytesToRead)) == 0);
|
|
|
+ assert (!in.fail() );
|
|
|
+ assert (std::memcmp(buffer1.begin(), buffer2.begin(), static_cast<std::size_t>(bytesToRead)) == 0);
|
|
|
size -= bytesToRead;
|
|
|
}
|
|
|
char c;
|
|
|
@@ -210,9 +238,9 @@ void ZipTest::verifyDataFile(const std::string& path, Poco::UInt64 size)
|
|
|
void ZipTest::testDecompressZip64()
|
|
|
{
|
|
|
std::map<std::string, Poco::UInt64> files;
|
|
|
- files["data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;
|
|
|
- files["data2.bin"] = static_cast<Poco::UInt64>(KB)*16;
|
|
|
- files["data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;
|
|
|
+ files[Poco::Path::temp() + "data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;
|
|
|
+ files[Poco::Path::temp() + "data2.bin"] = static_cast<Poco::UInt64>(KB)*16;
|
|
|
+ files[Poco::Path::temp() + "data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;
|
|
|
|
|
|
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
|
|
|
{
|
|
|
@@ -220,8 +248,8 @@ void ZipTest::testDecompressZip64()
|
|
|
if(file.exists())
|
|
|
file.remove();
|
|
|
}
|
|
|
- std::ifstream in("zip64.zip", std::ios::binary);
|
|
|
- Decompress c(in, ".");
|
|
|
+ std::ifstream in(Poco::Path::temp() + "zip64.zip", std::ios::binary);
|
|
|
+ Decompress c(in, Poco::Path::temp());
|
|
|
c.decompressAllFiles();
|
|
|
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
|
|
|
{
|
|
|
@@ -230,6 +258,43 @@ void ZipTest::testDecompressZip64()
|
|
|
}
|
|
|
|
|
|
|
|
|
+void ZipTest::testValidPath()
|
|
|
+{
|
|
|
+ assert (ZipCommon::isValidPath("."));
|
|
|
+ assert (ZipCommon::isValidPath("file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath(".file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath("..file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath("file.txt.."));
|
|
|
+ assert (ZipCommon::isValidPath(".file..txt"));
|
|
|
+ assert (ZipCommon::isValidPath("~file..txt"));
|
|
|
+ assert (ZipCommon::isValidPath("~file/~"));
|
|
|
+ assert (ZipCommon::isValidPath("dir/~"));
|
|
|
+ assert (ZipCommon::isValidPath("some"));
|
|
|
+ assert (ZipCommon::isValidPath("some/dir"));
|
|
|
+ assert (ZipCommon::isValidPath("some/dir/or/another"));
|
|
|
+ assert (ZipCommon::isValidPath("some/dir/./another"));
|
|
|
+ assert (ZipCommon::isValidPath("some/dir/or/another/file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath("s~me\\d.r\\.or..\\an..her\\file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath("some\\dir\\or\\another"));
|
|
|
+ assert (ZipCommon::isValidPath("some\\dir\\or\\another\\file.txt"));
|
|
|
+ assert (ZipCommon::isValidPath("s~me\\d.r/.or..\\an..her\\file.txt"));
|
|
|
+
|
|
|
+ assert (!ZipCommon::isValidPath("/../"));
|
|
|
+ assert (!ZipCommon::isValidPath("/"));
|
|
|
+ assert (!ZipCommon::isValidPath("\\..\\"));
|
|
|
+ assert (!ZipCommon::isValidPath("/..\\"));
|
|
|
+ assert (!ZipCommon::isValidPath("\\../"));
|
|
|
+ assert (!ZipCommon::isValidPath(".."));
|
|
|
+ assert (!ZipCommon::isValidPath("~/"));
|
|
|
+ assert (!ZipCommon::isValidPath("~/~"));
|
|
|
+ assert (!ZipCommon::isValidPath("/~"));
|
|
|
+ assert (!ZipCommon::isValidPath("/file.txt"));
|
|
|
+ assert (!ZipCommon::isValidPath("~/file.txt"));
|
|
|
+ assert (!ZipCommon::isValidPath("some/dir/or/../another/file.txt"));
|
|
|
+ assert (!ZipCommon::isValidPath("C:\\Windows\\system32"));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void ZipTest::onDecompressError(const void* pSender, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string>& info)
|
|
|
{
|
|
|
++_errCnt;
|
|
|
@@ -256,9 +321,12 @@ CppUnit::Test* ZipTest::suite()
|
|
|
CppUnit_addTest(pSuite, ZipTest, testDecompressSingleFileInDir);
|
|
|
CppUnit_addTest(pSuite, ZipTest, testDecompress);
|
|
|
CppUnit_addTest(pSuite, ZipTest, testDecompressFlat);
|
|
|
+ CppUnit_addTest(pSuite, ZipTest, testDecompressVuln);
|
|
|
+ CppUnit_addTest(pSuite, ZipTest, testDecompressFlatVuln);
|
|
|
CppUnit_addTest(pSuite, ZipTest, testCrcAndSizeAfterData);
|
|
|
CppUnit_addTest(pSuite, ZipTest, testCrcAndSizeAfterDataWithArchive);
|
|
|
CppUnit_addTest(pSuite, ZipTest, testDecompressZip64);
|
|
|
+ CppUnit_addTest(pSuite, ZipTest, testValidPath);
|
|
|
|
|
|
return pSuite;
|
|
|
}
|