From de468f92ec0de37b27b204e72413692b4c1e3d7c Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 11 Jul 2016 00:15:37 -0700 Subject: [PATCH] posix: ReadAll should handle the case when parent is not a dir. (#2163) It can happen so that a read request can come for a file which already has a parent i.e a file. This fix handles this scenario - fixes #2047 --- posix.go | 11 +++++++---- posix_test.go | 11 +++++++++-- xl-v1-metadata.go | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/posix.go b/posix.go index 68a3b5aa9..0ac1107c3 100644 --- a/posix.go +++ b/posix.go @@ -424,11 +424,14 @@ func (s *posix) ReadAll(volume, path string) (buf []byte, err error) { } else if os.IsPermission(err) { return nil, errFileAccessDenied } else if pathErr, ok := err.(*os.PathError); ok { - if pathErr.Err == syscall.EISDIR { - return nil, errFileNotFound - } else if strings.Contains(pathErr.Err.Error(), "The handle is invalid") { - // This case is special and needs to be handled for windows. + switch pathErr.Err { + case syscall.ENOTDIR, syscall.EISDIR: return nil, errFileNotFound + default: + if strings.Contains(pathErr.Err.Error(), "The handle is invalid") { + // This case is special and needs to be handled for windows. + return nil, errFileNotFound + } } return nil, pathErr } diff --git a/posix_test.go b/posix_test.go index bccaccdaa..b8843e004 100644 --- a/posix_test.go +++ b/posix_test.go @@ -73,6 +73,9 @@ func TestReadAll(t *testing.T) { if err = posix.AppendFile("exists", "as-file", []byte("Hello, World")); err != nil { t.Fatalf("Unable to create a file \"as-file\", %s", err) } + if err = posix.AppendFile("exists", "as-file-parent", []byte("Hello, World")); err != nil { + t.Fatalf("Unable to create a file \"as-file-parent\", %s", err) + } // Testcases to validate different conditions for ReadAll API. testCases := []struct { @@ -99,8 +102,12 @@ func TestReadAll(t *testing.T) { "as-directory", errFileNotFound, }, - // Validate the good condition file exists and we are able to - // read it. + { + "exists", + "as-file-parent/as-file", + errFileNotFound, + }, + // Validate the good condition file exists and we are able to read it. { "exists", "as-file", diff --git a/xl-v1-metadata.go b/xl-v1-metadata.go index 78c07fa2d..c6e10b819 100644 --- a/xl-v1-metadata.go +++ b/xl-v1-metadata.go @@ -203,6 +203,7 @@ var objMetadataOpIgnoredErrs = []error{ errDiskAccessDenied, errFaultyDisk, errVolumeNotFound, + errFileAccessDenied, } // readXLMetadata - returns the object metadata `xl.json` content from