From adf6ce30db9271c070ad49b27823d693e4a54d7f Mon Sep 17 00:00:00 2001 From: KU Date: Tue, 30 Jul 2019 16:01:06 +0900 Subject: [PATCH] readdir can return NT_STATUS_FILE_CORRUPT_ERROR. --- source3/modules/vfs_default.c | 1 + source3/smbd/dir.c | 4 +++- source3/smbd/reply.c | 4 ++++ source3/smbd/smb2_query_directory.c | 3 +++ source3/smbd/trans2.c | 3 +++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 84c22bb1517..16dfa36e617 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -426,6 +426,7 @@ static struct dirent *vfswrap_readdir(vfs_handle_struct *handle, { struct dirent *result; + errno = 0; START_PROFILE(syscall_readdir); result = readdir(dirp); END_PROFILE(syscall_readdir); diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index 2c59cb898ec..ff94a90152d 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1769,7 +1769,9 @@ const char *ReadDirName(struct smb_Dir *dirp, long *poffset, dirp->file_number++; return n; } - *poffset = dirp->offset = END_OF_DIRECTORY_OFFSET; + if (errno == 0) { + *poffset = dirp->offset = END_OF_DIRECTORY_OFFSET; + } *ptalloced = NULL; return NULL; } diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 2622681a2da..cd2f956a692 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1968,6 +1968,10 @@ void reply_search(struct smb_request *req) &date, check_descend, ask_sharemode); + if (errno == EIO) { + reply_nterror(req, NT_STATUS_FILE_CORRUPT_ERROR); + goto out; + } if (!finished) { char buf[DIR_STRUCT_SIZE]; memcpy(buf,status,21); diff --git a/source3/smbd/smb2_query_directory.c b/source3/smbd/smb2_query_directory.c index d433f2bee42..c6945f4defa 100644 --- a/source3/smbd/smb2_query_directory.c +++ b/source3/smbd/smb2_query_directory.c @@ -608,6 +608,9 @@ static bool smb2_query_directory_next_entry(struct tevent_req *req) * entry. */ return false; + } else if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_CORRUPT_ERROR)) { + tevent_req_nterror(req, NT_STATUS_FILE_CORRUPT_ERROR); + return true; } else if (state->num > 0) { goto last_entry_done; } else if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) { diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 5b99240e9e8..a78a3bb248e 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -2568,6 +2568,9 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx, &mode, &prev_dirpos); if (!ok) { + if (errno == EIO) { + return NT_STATUS_FILE_CORRUPT_ERROR; + } return NT_STATUS_END_OF_FILE; } -- 2.17.0.windows.1