Fix CopyOnWriteFs Stat to handle *os.PathError CopyOnWriteFs Stat function only checks its base file system's file or directory when its layer file system returns Stat error but if the layer file system type is OsFs, it returns *os.PathError not syscall.ENOENT so in this case, the base file system's file or directory is never checked. This fixes the behavior above by expanding *os.PathError and repacking the error code if the error type is *os.PathError.
diff --git a/copyOnWriteFs.go b/copyOnWriteFs.go index 2f8c61b..039ce53 100644 --- a/copyOnWriteFs.go +++ b/copyOnWriteFs.go
@@ -75,14 +75,17 @@ func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) { fi, err := u.layer.Stat(name) - switch err { - case nil: - return fi, nil - case syscall.ENOENT: - return u.base.Stat(name) - default: - return nil, err + if err != nil { + origErr := err + if e, ok := err.(*os.PathError); ok { + err = e.Err + } + if err == syscall.ENOENT { + return u.base.Stat(name) + } + return nil, origErr } + return fi, nil } // Renaming files present only in the base layer is not permitted