63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
|
Index: src/pkg/archive/tar/writer.go
|
||
|
===================================================================
|
||
|
--- a/src/pkg/archive/tar/writer.go
|
||
|
+++ b/src/pkg/archive/tar/writer.go
|
||
|
@@ -263,8 +263,11 @@
|
||
|
length--
|
||
|
}
|
||
|
i := strings.LastIndex(name[:length], "/")
|
||
|
- nlen := length - i - 1
|
||
|
- if i <= 0 || nlen > fileNameSize || nlen == 0 {
|
||
|
+ // nlen contains the resulting length in the name field.
|
||
|
+ // plen contains the resulting length in the prefix field.
|
||
|
+ nlen := len(name) - i - 1
|
||
|
+ plen := i
|
||
|
+ if i <= 0 || nlen > fileNameSize || nlen == 0 || plen > fileNamePrefixSize {
|
||
|
err = errNameTooLong
|
||
|
return
|
||
|
}
|
||
|
Index: src/pkg/archive/tar/writer_test.go
|
||
|
===================================================================
|
||
|
--- a/src/pkg/archive/tar/writer_test.go
|
||
|
+++ b/src/pkg/archive/tar/writer_test.go
|
||
|
@@ -355,3 +355,39 @@
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+func TestUSTARLongName(t *testing.T) {
|
||
|
+ // Create an archive with a path that failed to split with USTAR extension in previous versions.
|
||
|
+ fileinfo, err := os.Stat("testdata/small.txt")
|
||
|
+ if err != nil {
|
||
|
+ t.Fatal(err)
|
||
|
+ }
|
||
|
+ hdr, err := FileInfoHeader(fileinfo, "")
|
||
|
+ hdr.Typeflag = TypeDir
|
||
|
+ if err != nil {
|
||
|
+ t.Fatalf("os.Stat:1 %v", err)
|
||
|
+ }
|
||
|
+ // Force a PAX long name to be written. The name was taken from a practical example
|
||
|
+ // that fails and replaced ever char through numbers to anonymize the sample.
|
||
|
+ longName := "/0000_0000000/00000-000000000/0000_0000000/00000-0000000000000/0000_0000000/00000-0000000-00000000/0000_0000000/00000000/0000_0000000/000/0000_0000000/00000000v00/0000_0000000/000000/0000_0000000/0000000/0000_0000000/00000y-00/0000/0000/00000000/0x000000/"
|
||
|
+ hdr.Name = longName
|
||
|
+
|
||
|
+ hdr.Size = 0
|
||
|
+ var buf bytes.Buffer
|
||
|
+ writer := NewWriter(&buf)
|
||
|
+ if err := writer.WriteHeader(hdr); err != nil {
|
||
|
+ t.Fatal(err)
|
||
|
+ }
|
||
|
+ if err := writer.Close(); err != nil {
|
||
|
+ t.Fatal(err)
|
||
|
+ }
|
||
|
+ // Test that we can get a long name back out of the archive.
|
||
|
+ reader := NewReader(&buf)
|
||
|
+ hdr, err = reader.Next()
|
||
|
+ if err != nil {
|
||
|
+ t.Fatal(err)
|
||
|
+ }
|
||
|
+ if hdr.Name != longName {
|
||
|
+ t.Fatal("Couldn't recover long name")
|
||
|
+ }
|
||
|
+}
|