diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index 506148ee30..5f0c0a1a55 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -336,6 +336,12 @@ func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) { fh.Method = Store fh.Flags &^= 0x8 // we will not write a data descriptor + // Explicitly clear sizes as they have no meaning for directories. + fh.CompressedSize = 0 + fh.CompressedSize64 = 0 + fh.UncompressedSize = 0 + fh.UncompressedSize64 = 0 + ow = dirWriter{} } else { fh.Flags |= 0x8 // we will write a data descriptor @@ -419,7 +425,10 @@ func (w *Writer) compressor(method uint16) Compressor { type dirWriter struct{} -func (dirWriter) Write([]byte) (int, error) { +func (dirWriter) Write(b []byte) (int, error) { + if len(b) == 0 { + return 0, nil + } return 0, errors.New("zip: write to directory") } diff --git a/src/archive/zip/writer_test.go b/src/archive/zip/writer_test.go index 468424c72a..1fedfd85e8 100644 --- a/src/archive/zip/writer_test.go +++ b/src/archive/zip/writer_test.go @@ -306,21 +306,28 @@ func TestWriterDir(t *testing.T) { if err != nil { t.Fatal(err) } + if _, err := dw.Write(nil); err != nil { + t.Errorf("Write(nil) to directory: got %v, want nil", err) + } if _, err := dw.Write([]byte("hello")); err == nil { - t.Error("Write to directory: got nil error, want non-nil") + t.Error(`Write("hello") to directory: got nil error, want non-nil`) } } func TestWriterDirAttributes(t *testing.T) { var buf bytes.Buffer w := NewWriter(&buf) - if _, err := w.Create("dir/"); err != nil { + if _, err := w.CreateHeader(&FileHeader{ + Name: "dir/", + Method: Deflate, + CompressedSize64: 1234, + UncompressedSize64: 5678, + }); err != nil { t.Fatal(err) } if err := w.Close(); err != nil { t.Fatal(err) } - b := buf.Bytes() var sig [4]byte