libzip:在加载之前验证zip文件

时间:2013-10-15 09:50:24

标签: c++ libzip

我使用libzip在我的应用程序中打开zip文件,为了确保在损坏的zip文件的情况下的良好行为我手动损坏了zip文件(通过使用文本编辑器删除一些随机行)并尝试加载该文件。然而,这会挂起整个应用程序,因为zip_fread()永远不会返回。

在加载zip文件之前是否有确定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,所以很容易在那里发现错误。

0 个答案:

没有答案