reactos/drivers/filesystems/npfs/volinfo.c
Nguyen Trung Khanh 166f815e7b
[FILESYSTEMS] Fix pool memory disclosure in filesystem drivers supporting FS_INFORMATION_CLASS.FileFsVolumeInformation (#2975)
* FileFsVolumeInformation-memory-disclosure

* remove unnecessary assignment to 0

* fix
2020-09-11 15:51:35 +03:00

207 lines
5 KiB
C

/*
* PROJECT: ReactOS Named Pipe FileSystem
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: drivers/filesystems/npfs/volinfo.c
* PURPOSE: Named Pipe FileSystem Volume Information
* PROGRAMMERS: ReactOS Portable Systems Group
*/
/* INCLUDES *******************************************************************/
#include "npfs.h"
// File ID number for NPFS bugchecking support
#define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_VOLINFO)
/* FUNCTIONS ******************************************************************/
NTSTATUS
NTAPI
NpQueryFsVolumeInfo(IN PVOID Buffer,
IN OUT PULONG Length)
{
PFILE_FS_VOLUME_INFORMATION InfoBuffer = Buffer;
NTSTATUS Status;
USHORT NameLength;
TRACE("Entered\n");
*Length -= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel);
InfoBuffer->SupportsObjects = 0;
NameLength = 18;
InfoBuffer->VolumeLabelLength = 18;
if (*Length < 18)
{
NameLength = (USHORT)*Length;
Status = STATUS_BUFFER_OVERFLOW;
}
else
{
Status = STATUS_SUCCESS;
}
RtlCopyMemory(InfoBuffer->VolumeLabel, L"NamedPipe", NameLength);
*Length -= NameLength;
TRACE("Leaving, Status = %lx\n", Status);
return Status;
}
NTSTATUS
NTAPI
NpQueryFsSizeInfo(IN PVOID Buffer,
IN OUT PULONG Length)
{
PFILE_FS_SIZE_INFORMATION InfoBuffer = Buffer;
TRACE("Entered\n");
*Length -= sizeof(*InfoBuffer);
InfoBuffer->SectorsPerAllocationUnit = 1;
InfoBuffer->BytesPerSector = 1;
TRACE("Leaving, Status = STATUS_SUCCESS\n");
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
NpQueryFsDeviceInfo(IN PVOID Buffer,
IN OUT PULONG Length)
{
PFILE_FS_DEVICE_INFORMATION InfoBuffer = Buffer;
TRACE("Entered\n");
InfoBuffer->DeviceType = FILE_DEVICE_NAMED_PIPE;
*Length -= sizeof(*InfoBuffer);
TRACE("Leaving, Status = STATUS_SUCCESS\n");
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
NpQueryFsAttributeInfo(IN PVOID Buffer,
IN OUT PULONG Length)
{
PFILE_FS_ATTRIBUTE_INFORMATION InfoBuffer = Buffer;
NTSTATUS Status;
USHORT NameLength;
TRACE("Entered\n");
NameLength = (USHORT)(*Length - 12);
if (NameLength < 8)
{
*Length = 0;
Status = STATUS_BUFFER_OVERFLOW;
}
else
{
*Length -= 20;
NameLength = 8;
Status = STATUS_SUCCESS;
}
InfoBuffer->MaximumComponentNameLength = 0xFFFFFFFF;
InfoBuffer->FileSystemNameLength = 8;
InfoBuffer->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES;
RtlCopyMemory(InfoBuffer->FileSystemName, L"NPFS", NameLength);
TRACE("Leaving, Status = %lx\n", Status);
return Status;
}
NTSTATUS
NTAPI
NpQueryFsFullSizeInfo(IN PVOID Buffer,
IN OUT PULONG Length)
{
PFILE_FS_FULL_SIZE_INFORMATION InfoBuffer = Buffer;
TRACE("Entered\n");
*Length -= sizeof(*InfoBuffer);
RtlZeroMemory(InfoBuffer, sizeof(*InfoBuffer));
TRACE("Leaving, Status = STATUS_SUCCESS\n");
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
NpCommonQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
FS_INFORMATION_CLASS InfoClass;
ULONG Length;
PVOID Buffer;
NTSTATUS Status;
PAGED_CODE();
TRACE("Entered\n");
IoStack = IoGetCurrentIrpStackLocation(Irp);
Buffer = Irp->AssociatedIrp.SystemBuffer;
Length = IoStack->Parameters.QueryVolume.Length;
InfoClass = IoStack->Parameters.QueryVolume.FsInformationClass;
RtlZeroMemory(Buffer, Length);
switch (InfoClass)
{
case FileFsVolumeInformation:
Status = NpQueryFsVolumeInfo(Buffer, &Length);
break;
case FileFsSizeInformation:
Status = NpQueryFsSizeInfo(Buffer, &Length);
break;
case FileFsDeviceInformation:
Status = NpQueryFsDeviceInfo(Buffer, &Length);
break;
case FileFsAttributeInformation:
Status = NpQueryFsAttributeInfo(Buffer, &Length);
break;
case FileFsFullSizeInformation:
Status = NpQueryFsFullSizeInfo(Buffer, &Length);
break;
default:
Status = STATUS_NOT_SUPPORTED;
break;
}
Irp->IoStatus.Information = IoStack->Parameters.QueryVolume.Length - Length;
TRACE("Leaving, Status = %lx\n", Status);
return Status;
}
NTSTATUS
NTAPI
NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS Status;
PAGED_CODE();
TRACE("Entered\n");
FsRtlEnterFileSystem();
NpAcquireSharedVcb();
Status = NpCommonQueryVolumeInformation(DeviceObject, Irp);
NpReleaseVcb();
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
}
TRACE("Leaving, Status = %lx\n", Status);
return Status;
}
/* EOF */