]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: use best effort at writing USTAR header
authorJoe Tsai <joetsai@digital-static.net>
Wed, 28 Jun 2017 00:30:39 +0000 (17:30 -0700)
committerJoe Tsai <thebrokentoaster@gmail.com>
Wed, 28 Jun 2017 03:09:38 +0000 (03:09 +0000)
Prior to this change, if the Writer needed to use the PAX format, it would
output a USTAR header with an empty name. This should be okay since the PAX
specification dictates that the PAX record for "path" should override the
semantic meaning of any of the old USTAR fields.

Unfortunately, the implementation of tar on OpenBSD 6.1 is too strict with
their handling of PAX files such that they check for the validity of this
bogus field even though the PAX header is present.

To allow Go's Writer output be parsible by OpenBSD's tar utility,
we write a best-effort (ASCII-only and truncated) version of the original
file name. Note that this still fails in some edge-cases (for example,
a Chinese filename containing all non-ASCII characters). OpenBSD should really
relax their checking, as you honestly can't always expect a sensible path
to be generated when USTAR cannot handle the original path.

Fixes #20707

Change-Id: Id7d77349023d2152d7291d582cd050b6681760e4
Reviewed-on: https://go-review.googlesource.com/46914
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/archive/tar/testdata/ustar.issue12594.tar
src/archive/tar/testdata/writer-big-long.tar
src/archive/tar/writer.go

index c7910ae9f43b54e32b9facf34c9e96a03626adea..50fcd00976066625be6d9aef68aa7b24a6a99c29 100644 (file)
Binary files a/src/archive/tar/testdata/ustar.issue12594.tar and b/src/archive/tar/testdata/ustar.issue12594.tar differ
index 52bd748f3b286745455e815c63b6801c3fe06e91..ea9bfa88bbb9df7de8ae93d507802bcfa4738050 100644 (file)
Binary files a/src/archive/tar/testdata/writer-big-long.tar and b/src/archive/tar/testdata/writer-big-long.tar differ
index 596fb8b9e171f6386daa3792e46ff8359c73af05..c51c243a8b8efe091d5318483467aaf6e6446566 100644 (file)
@@ -121,9 +121,15 @@ func (tw *Writer) writeHeader(hdr *Header, allowPax bool) error {
                needsPaxHeader := paxKeyword != paxNone && len(s) > len(b) || !isASCII(s)
                if needsPaxHeader {
                        paxHeaders[paxKeyword] = s
-                       return
                }
-               f.formatString(b, s)
+
+               // Write string in a best-effort manner to satisfy readers that expect
+               // the field to be non-empty.
+               s = toASCII(s)
+               if len(s) > len(b) {
+                       s = s[:len(b)]
+               }
+               f.formatString(b, s) // Should never error
        }
        var formatNumeric = func(b []byte, x int64, paxKeyword string) {
                // Try octal first.