]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: make check for hole detection support more liberal
authorJoe Tsai <joetsai@digital-static.net>
Thu, 21 Sep 2017 06:20:28 +0000 (23:20 -0700)
committerJoe Tsai <thebrokentoaster@gmail.com>
Thu, 21 Sep 2017 17:49:35 +0000 (17:49 +0000)
On most Unix OSes, lseek reports EINVAL when lacking SEEK_HOLE support.
However, there are reports that ENOTTY is reported instead.
Rather than tracking down every possible errno that may be used to
represent "not supported", just treat any non-nil error as meaning
that there is no support. This is the same strategy taken by the
GNU and BSD tar tools.

Fixes #21958

Change-Id: Iae68afdc934042f52fa914fca45f0ca89220c383
Reviewed-on: https://go-review.googlesource.com/65191
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/sparse_unix.go

index 76b4c6cc2b9381ba70ede0eee48e43e1ea544667..4bc348285893d19351eaaa071e3f36ce5292d577 100644 (file)
@@ -23,8 +23,12 @@ func sparseDetectUnix(f *os.File) (sph sparseHoles, err error) {
        const seekHole = 4 // SEEK_HOLE from unistd.h
 
        // Check for seekData/seekHole support.
-       if _, err := f.Seek(0, seekHole); errno(err) == syscall.EINVAL {
-               return nil, nil // Either old kernel or FS does not support this
+       // Different OS and FS may differ in the exact errno that is returned when
+       // there is no support. Rather than special-casing every possible errno
+       // representing "not supported", just assume that a non-nil error means
+       // that seekData/seekHole is not supported.
+       if _, err := f.Seek(0, seekHole); err != nil {
+               return nil, nil
        }
 
        // Populate the SparseHoles.