[インデックス 18191] ファイルの概要
このコミットは、Go言語の標準ライブラリ archive/zip
パッケージにおけるZIP64形式の取り扱いに関する以前の修正を検証するための新しいテストケースを追加するものです。具体的には、golang.org/issue/7069
で報告された問題に関連し、異なるExtraフィールドを持つZIP64ファイルに対するarchive/zip
リーダーの堅牢性を確保することを目的としています。
コミット
- コミットハッシュ:
e7c21703a86458121545b814c49383bc903acfc8
- Author: Brad Fitzpatrick bradfitz@golang.org
- Date: Wed Jan 8 11:28:40 2014 -0800
- Message:
archive/zip: new test for earlier zip64 fix Update #7069 R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/49180043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e7c21703a86458121545b814c49383bc903acfc8
元コミット内容
archive/zip: new test for earlier zip64 fix
Update #7069
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/49180043
変更の背景
このコミットは、Go言語のarchive/zip
パッケージがZIP64形式のアーカイブを正しく処理できることを保証するために行われました。特に、golang.org/issue/7069
で追跡されていた問題に対応しています。この問題は、以前のZIP64関連の修正が、特定の種類のZIP64ファイル、特にExtraフィールドの構造が異なるファイルに対して完全に機能しない可能性があったことを示唆しています。このコミットは、そのようなエッジケースを捕捉し、archive/zip
リーダーの堅牢性を高めるための新しいテストケースを追加することで、以前の修正を補完し、検証することを目的としています。
前提知識の解説
ZIP64形式
通常のZIPファイル形式には、ファイルサイズ、圧縮/非圧縮サイズ、エントリ数、オフセットなどのフィールドに2バイトまたは4バイトの制限があります。これにより、単一ファイルが4GBを超える場合や、アーカイブ内のエントリ数が65535を超える場合に問題が発生します。
ZIP64は、これらの制限を克服するために導入されたZIPファイル形式の拡張です。ZIP64では、これらのサイズやオフセットのフィールドが8バイト(64ビット)に拡張され、より大きなファイルや多数のエントリを含むアーカイブをサポートできるようになります。ZIP64形式のファイルは、通常のZIPリーダーでは読み取れない場合があるため、ZIP64をサポートするリーダーが必要です。
ZIPファイル形式では、各ファイルエントリのヘッダや中央ディレクトリレコードに「Extraフィールド」と呼ばれる可変長のデータ領域が存在します。このExtraフィールドは、ZIP64拡張情報(オリジナルのサイズ、圧縮サイズ、ローカルヘッダオフセット、ディスク番号など)を含むために使用されます。ZIP64の仕様では、これらのExtraフィールドの構造や配置にいくつかのバリエーションが存在する可能性があり、これが互換性の問題を引き起こすことがあります。
Go言語の archive/zip
パッケージ
Go言語の標準ライブラリには、archive/zip
パッケージが含まれており、ZIPアーカイブの読み書きをサポートしています。このパッケージは、ZIPファイル形式の基本的な機能を提供し、GoアプリケーションでZIPファイルを扱うための基盤となります。ZIP64のサポートも含まれていますが、その実装は様々なZIP64ファイルのバリエーションに対応する必要があります。
技術的詳細
このコミットの技術的な詳細は、archive/zip
パッケージがZIP64形式のファイルを、特に「異なるExtraフィールド」を持つ場合に正しく処理できることを保証するためのテストカバレッジの強化にあります。
golang.org/issue/7069
は、archive/zip
パッケージが特定のZIP64アーカイブを正しく読み取れないという問題を示していました。これは、ZIP64の仕様が複雑であり、様々なツールが異なる方法でExtraフィールドを実装している可能性があるためです。以前の修正では、一部のZIP64問題が解決されましたが、このコミットは、その修正がすべての関連するエッジケース、特にExtraフィールドのバリエーションをカバーしていることを確認するためのものです。
追加されたテストケース zip64-2.zip
は、以前のZIP64ファイルとは異なるExtraフィールドの構造を持つように特別に作成されたバイナリファイルです。この新しいテストファイルを使用することで、archive/zip
リーダーが、Extraフィールドの異なる配置や内容を持つZIP64アーカイブも適切に解析し、ファイルの内容を抽出できることを検証します。
また、readTestFile
関数におけるエラーハンドリングの改善も行われています。以前は単にt.Error(err)
としていた部分がt.Errorf("%s: %v", zt.Name, err)
に変更され、どのテストファイルでエラーが発生したかをより明確に識別できるようになりました。これはデバッグの際に非常に役立ちます。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は以下の2点です。
-
src/pkg/archive/zip/reader_test.go
の変更:- 新しい
ZipTest
エントリがtests
スライスに追加されました。このエントリは"zip64-2.zip"
という名前のテストアーカイブを参照し、その中に"README"
というファイルが含まれていることを定義しています。 readTestFile
関数内のエラー報告が改善されました。
- 新しい
-
src/pkg/archive/zip/testdata/zip64-2.zip
の追加:- 新しいバイナリテストファイル
zip64-2.zip
がtestdata
ディレクトリに追加されました。このファイルは、reader_test.go
で定義された新しいテストケースで使用されます。
- 新しいバイナリテストファイル
コアとなるコードの解説
src/pkg/archive/zip/reader_test.go
@@ -235,6 +235,18 @@ var tests = []ZipTest{
},
},
},
+ // Another zip64 file with different Extras fields. (golang.org/issue/7069)
+ {
+ Name: "zip64-2.zip",
+ File: []ZipTestFile{
+ {
+ Name: "README",
+ Content: []byte("This small file is in ZIP64 format.\n"),
+ Mtime: "08-10-12 14:33:32",
+ Mode: 0644,
+ },
+ },
+ },
}
var crossPlatform = []ZipTestFile{
@@ -348,7 +360,7 @@ func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
var b bytes.Buffer
r, err := f.Open()
if err != nil {
-\t\tt.Error(err)\n+\t\tt.Errorf("%s: %v", zt.Name, err)\n \t\treturn\n \t}
-
新しい
ZipTest
エントリ:tests
スライスに追加された新しいエントリは、"zip64-2.zip"
という名前のZIPアーカイブをテスト対象として指定しています。- このアーカイブには
"README"
という名前の単一のファイルが含まれており、その内容、最終更新時刻、およびファイルモードが定義されています。 - コメント
// Another zip64 file with different Extras fields. (golang.org/issue/7069)
は、このテストの目的が、golang.org/issue/7069
で報告された問題に関連する、Extraフィールドの異なるZIP64ファイルを検証することであることを明確に示しています。これは、archive/zip
パッケージがZIP64の様々な実装バリエーションに対応できることを保証するために重要です。
-
readTestFile
のエラー報告の改善:t.Error(err)
からt.Errorf("%s: %v", zt.Name, err)
への変更は、テストが失敗した際に、どのZIPファイル(zt.Name
)の処理中にエラーが発生したかをエラーメッセージに含めるようにします。これにより、テストのデバッグが容易になります。
src/pkg/archive/zip/testdata/zip64-2.zip
このファイルはバイナリデータであり、コミットログにはBin 0 -> 266 bytes
と表示されています。これは、このコミットで新しいファイルとして追加され、そのサイズが266バイトであることを意味します。このファイルは、reader_test.go
で定義された新しいテストケース"zip64-2.zip"
に対応する実際のZIPアーカイブデータです。このバイナリファイルは、ZIP64形式であり、特にExtraフィールドの構造が、既存のテストファイルとは異なるように細工されています。これにより、archive/zip
リーダーがExtraフィールドの様々なバリエーションを正しく解釈できるかどうかがテストされます。
関連リンク
- Go Issue #7069: https://golang.org/issue/7069
- Gerrit Change List: https://golang.org/cl/49180043
参考にした情報源リンク
- Go Issue Tracker (golang.org/issue/7069の検索結果)
- ZIPファイル形式の仕様 (ZIP64に関する情報)
- Go言語
archive/zip
パッケージのドキュメント