aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/archive/zip/writer.go11
-rw-r--r--src/archive/zip/writer_test.go13
2 files changed, 20 insertions, 4 deletions
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