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.
This commit is contained in:
Tatsushi Demachi 2016-01-31 23:02:37 +09:00
parent 27290598eb
commit 3bf3fe3a71
1 changed files with 10 additions and 7 deletions

View File

@ -75,14 +75,17 @@ func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error {
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