3

アプリケーションで 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 の結果を返すため、そこでエラーをキャッチするのは簡単です。

4

0 に答える 0