SMBServer: Correct handling of STATUS_BUFFER_OVERFLOW returned by the NTFileStore

This commit is contained in:
Tal Aloni 2017-07-11 21:19:44 +03:00
parent 9669f16bb5
commit 4fef34e7cd
4 changed files with 6 additions and 5 deletions

View file

@ -103,7 +103,7 @@ namespace SMBLibrary.Server.SMB1
header.Status = NTStatus.STATUS_SMB_BAD_COMMAND; header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
} }
if (header.Status != NTStatus.STATUS_SUCCESS) if (subcommandResponse == null)
{ {
return new ErrorResponse(CommandName.SMB_COM_NT_TRANSACT); return new ErrorResponse(CommandName.SMB_COM_NT_TRANSACT);
} }
@ -129,7 +129,7 @@ namespace SMBLibrary.Server.SMB1
int maxOutputLength = (int)maxDataCount; int maxOutputLength = (int)maxDataCount;
byte[] output; byte[] output;
header.Status = share.FileStore.DeviceIOControl(openFile.Handle, subcommand.FunctionCode, subcommand.Data, out output, maxOutputLength); 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; return null;
} }

View file

@ -167,7 +167,7 @@ namespace SMBLibrary.Server.SMB1
header.Status = NTStatus.STATUS_SMB_BAD_COMMAND; header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
} }
if (header.Status != NTStatus.STATUS_SUCCESS) if (subcommandResponse == null)
{ {
return new ErrorResponse(CommandName.SMB_COM_TRANSACTION); return new ErrorResponse(CommandName.SMB_COM_TRANSACTION);
} }

View file

@ -29,7 +29,7 @@ namespace SMBLibrary.Server.SMB1
int maxOutputLength = (int)maxDataCount; int maxOutputLength = (int)maxDataCount;
byte[] output; byte[] output;
header.Status = share.FileStore.DeviceIOControl(openFile.Handle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, subcommand.WriteData, out output, maxOutputLength); 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; return null;
} }

View file

@ -49,12 +49,13 @@ namespace SMBLibrary.Server.SMB2
int maxOutputLength = (int)request.MaxOutputResponse; int maxOutputLength = (int)request.MaxOutputResponse;
byte[] output; byte[] output;
NTStatus status = share.FileStore.DeviceIOControl(handle, request.CtlCode, request.Input, out output, maxOutputLength); 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); return new ErrorResponse(request.CommandName, status);
} }
IOCtlResponse response = new IOCtlResponse(); IOCtlResponse response = new IOCtlResponse();
response.Header.Status = status;
response.CtlCode = request.CtlCode; response.CtlCode = request.CtlCode;
response.FileId = request.FileId; response.FileId = request.FileId;
response.Output = output; response.Output = output;