From 4fef34e7cd258afb02fd76e9f8544e035fad8e89 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Tue, 11 Jul 2017 21:19:44 +0300 Subject: [PATCH] SMBServer: Correct handling of STATUS_BUFFER_OVERFLOW returned by the NTFileStore --- SMBLibrary/Server/SMB1/NTTransactHelper.cs | 4 ++-- SMBLibrary/Server/SMB1/TransactionHelper.cs | 2 +- SMBLibrary/Server/SMB1/TransactionSubcommandHelper.cs | 2 +- SMBLibrary/Server/SMB2/IOCtlHelper.cs | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/SMBLibrary/Server/SMB1/NTTransactHelper.cs b/SMBLibrary/Server/SMB1/NTTransactHelper.cs index bd64f36..a31395d 100644 --- a/SMBLibrary/Server/SMB1/NTTransactHelper.cs +++ b/SMBLibrary/Server/SMB1/NTTransactHelper.cs @@ -103,7 +103,7 @@ namespace SMBLibrary.Server.SMB1 header.Status = NTStatus.STATUS_SMB_BAD_COMMAND; } - if (header.Status != NTStatus.STATUS_SUCCESS) + if (subcommandResponse == null) { return new ErrorResponse(CommandName.SMB_COM_NT_TRANSACT); } @@ -129,7 +129,7 @@ namespace SMBLibrary.Server.SMB1 int maxOutputLength = (int)maxDataCount; byte[] output; header.Status = share.FileStore.DeviceIOControl(openFile.Handle, subcommand.FunctionCode, subcommand.Data, out output, maxOutputLength); - if (header.Status != NTStatus.STATUS_SUCCESS) + if (header.Status != NTStatus.STATUS_SUCCESS && header.Status != NTStatus.STATUS_BUFFER_OVERFLOW) { return null; } diff --git a/SMBLibrary/Server/SMB1/TransactionHelper.cs b/SMBLibrary/Server/SMB1/TransactionHelper.cs index fde7b7a..3d7ed99 100644 --- a/SMBLibrary/Server/SMB1/TransactionHelper.cs +++ b/SMBLibrary/Server/SMB1/TransactionHelper.cs @@ -167,7 +167,7 @@ namespace SMBLibrary.Server.SMB1 header.Status = NTStatus.STATUS_SMB_BAD_COMMAND; } - if (header.Status != NTStatus.STATUS_SUCCESS) + if (subcommandResponse == null) { return new ErrorResponse(CommandName.SMB_COM_TRANSACTION); } diff --git a/SMBLibrary/Server/SMB1/TransactionSubcommandHelper.cs b/SMBLibrary/Server/SMB1/TransactionSubcommandHelper.cs index 64f4459..a6709f5 100644 --- a/SMBLibrary/Server/SMB1/TransactionSubcommandHelper.cs +++ b/SMBLibrary/Server/SMB1/TransactionSubcommandHelper.cs @@ -29,7 +29,7 @@ namespace SMBLibrary.Server.SMB1 int maxOutputLength = (int)maxDataCount; byte[] output; header.Status = share.FileStore.DeviceIOControl(openFile.Handle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, subcommand.WriteData, out output, maxOutputLength); - if (header.Status != NTStatus.STATUS_SUCCESS) + if (header.Status != NTStatus.STATUS_SUCCESS && header.Status != NTStatus.STATUS_BUFFER_OVERFLOW) { return null; } diff --git a/SMBLibrary/Server/SMB2/IOCtlHelper.cs b/SMBLibrary/Server/SMB2/IOCtlHelper.cs index 6782dd8..7e55904 100644 --- a/SMBLibrary/Server/SMB2/IOCtlHelper.cs +++ b/SMBLibrary/Server/SMB2/IOCtlHelper.cs @@ -49,12 +49,13 @@ namespace SMBLibrary.Server.SMB2 int maxOutputLength = (int)request.MaxOutputResponse; byte[] output; NTStatus status = share.FileStore.DeviceIOControl(handle, request.CtlCode, request.Input, out output, maxOutputLength); - if (status != NTStatus.STATUS_SUCCESS) + if (status != NTStatus.STATUS_SUCCESS && status != NTStatus.STATUS_BUFFER_OVERFLOW) { return new ErrorResponse(request.CommandName, status); } IOCtlResponse response = new IOCtlResponse(); + response.Header.Status = status; response.CtlCode = request.CtlCode; response.FileId = request.FileId; response.Output = output;