aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2017-09-20 23:20:28 -0700
committerJoe Tsai <thebrokentoaster@gmail.com>2017-09-21 17:49:35 +0000
commitfdecab6ef00be4a2e6247ebd962a281276b3f37d (patch)
treeef3e1c63448e7c6f681f9d9b8969a02f599e324c /src
parent97324858513735093a958a585cca6d5fc2780533 (diff)
downloadgo-fdecab6ef00be4a2e6247ebd962a281276b3f37d.tar.xz
archive/tar: make check for hole detection support more liberal
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>
Diffstat (limited to 'src')
-rw-r--r--src/archive/tar/sparse_unix.go8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/archive/tar/sparse_unix.go b/src/archive/tar/sparse_unix.go
index 76b4c6cc2b..4bc3482858 100644
--- a/src/archive/tar/sparse_unix.go
+++ b/src/archive/tar/sparse_unix.go
@@ -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.