From 8c7b17426c827b5b049d21c7ac8e624b1cdf291b Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Tue, 27 Dec 2016 00:24:29 +0200 Subject: [PATCH] Handle IOException when opening a file --- .../Server/ResponseHelpers/NTCreateHelper.cs | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/SMBLibrary/Server/ResponseHelpers/NTCreateHelper.cs b/SMBLibrary/Server/ResponseHelpers/NTCreateHelper.cs index a2fecf6..fa07a65 100644 --- a/SMBLibrary/Server/ResponseHelpers/NTCreateHelper.cs +++ b/SMBLibrary/Server/ResponseHelpers/NTCreateHelper.cs @@ -247,7 +247,30 @@ namespace SMBLibrary.Server { bool buffered = (request.CreateOptions & CreateOptions.FILE_SEQUENTIAL_ONLY) > 0 && (request.CreateOptions & CreateOptions.FILE_NO_INTERMEDIATE_BUFFERING) == 0; System.Diagnostics.Debug.Print("[{0}] Opening {1}, Access={2}, Share={3}, Buffered={4}", DateTime.Now.ToString("HH:mm:ss:ffff"), path, fileAccess, fileShare, buffered); - stream = fileSystem.OpenFile(path, FileMode.Open, fileAccess, fileShare); + try + { + stream = fileSystem.OpenFile(path, FileMode.Open, fileAccess, fileShare); + } + catch (IOException ex) + { + ushort errorCode = IOExceptionHelper.GetWin32ErrorCode(ex); + if (errorCode == (ushort)Win32Error.ERROR_SHARING_VIOLATION) + { + header.Status = NTStatus.STATUS_SHARING_VIOLATION; + return new ErrorResponse(CommandName.SMB_COM_NT_CREATE_ANDX); + } + else + { + header.Status = NTStatus.STATUS_DATA_ERROR; + return new ErrorResponse(CommandName.SMB_COM_NT_CREATE_ANDX); + } + } + catch (UnauthorizedAccessException) + { + header.Status = NTStatus.STATUS_ACCESS_DENIED; + return new ErrorResponse(CommandName.SMB_COM_NT_CREATE_ANDX); + } + if (buffered) { stream = new PrefetchedStream(stream);