Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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点です。

  1. src/pkg/archive/zip/reader_test.go の変更:

    • 新しいZipTestエントリがtestsスライスに追加されました。このエントリは"zip64-2.zip"という名前のテストアーカイブを参照し、その中に"README"というファイルが含まれていることを定義しています。
    • readTestFile関数内のエラー報告が改善されました。
  2. src/pkg/archive/zip/testdata/zip64-2.zip の追加:

    • 新しいバイナリテストファイルzip64-2.ziptestdataディレクトリに追加されました。このファイルは、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 Tracker (golang.org/issue/7069の検索結果)
  • ZIPファイル形式の仕様 (ZIP64に関する情報)
  • Go言語 archive/zip パッケージのドキュメント