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")
 | |
| +	}
 | |
| +}
 |