我使用 libzip 在我的应用程序中打开 zip 文件,为了确保在 zip 文件损坏的情况下表现良好,我手动损坏了一个 zip 文件(通过使用文本编辑器删除一些随机行)并尝试加载该文件。但是,这会挂起整个应用程序,因为 zip_fread() 永远不会返回。
是否有在加载之前确定 zip 文件是否有效以避免这种情况的地方?
更新
行为似乎取决于版本,所以我可能只需要更新。这是我在 Windows、Mac OS 和 Linux 上使用的代码:
int err;
zip *z= zip_open(zipfile.c_str(), 0, &err);
if (!z)
{
if (err == ZIP_ER_NOZIP)
throw std::runtime_error("The file is not a Workbench document.");
else if (err == ZIP_ER_MEMORY)
throw grt::os_error("Cannot allocate enough memory to open document.");
else if (err == ZIP_ER_NOENT)
throw grt::os_error("File not found.");
int len= zip_error_to_str(NULL, 0, 0, err);
std::string msg;
if (len > 0)
{
char *buf= (char*)g_malloc(len+1);
zip_error_to_str(buf, len+1, 0, err);
msg= buf;
g_free(buf);
}
else
msg= "error opening zip archive";
zip_close(z);
throw std::runtime_error(strfmt(_("Cannot open document file: %s"), msg.c_str()));
}
在 OS X 上,这个片段不会返回错误(我对所有平台都使用了相同的文件)。相反,下面的 zip_read() 调用只是挂起。在其他平台上 zip_read() 立即返回结果 < 0,因此很容易在此处捕获错误。