fixed some missing NULL checks, reported by M Bealby in bug #1110
Modified: trunk/reactos/lib/kernel32/file/dir.c
Modified: trunk/reactos/lib/kernel32/file/npipe.c
Modified: trunk/reactos/lib/kernel32/file/volume.c
_____
Modified: trunk/reactos/lib/kernel32/file/dir.c
--- trunk/reactos/lib/kernel32/file/dir.c 2005-12-11 19:42:08 UTC
(rev 20078)
+++ trunk/reactos/lib/kernel32/file/dir.c 2005-12-11 20:04:38 UTC
(rev 20079)
@@ -828,16 +828,17 @@
LPSTR *lpFilePart
)
{
- UNICODE_STRING PathU;
- UNICODE_STRING FileNameU;
- UNICODE_STRING ExtensionU;
- UNICODE_STRING BufferU;
+ UNICODE_STRING PathU = {0};
+ UNICODE_STRING FileNameU = {0};
+ UNICODE_STRING ExtensionU = {0};
+ UNICODE_STRING BufferU = {0};
ANSI_STRING Path;
ANSI_STRING FileName;
ANSI_STRING Extension;
ANSI_STRING Buffer;
PWCHAR FilePartW;
- DWORD RetValue;
+ DWORD RetValue = 0;
+ NTSTATUS Status = STATUS_SUCCESS;
RtlInitAnsiString (&Path,
(LPSTR)lpPath);
@@ -849,36 +850,54 @@
/* convert ansi (or oem) strings to unicode */
if (bIsFileApiAnsi)
{
- RtlAnsiStringToUnicodeString (&PathU,
- &Path,
- TRUE);
- RtlAnsiStringToUnicodeString (&FileNameU,
- &FileName,
- TRUE);
- RtlAnsiStringToUnicodeString (&ExtensionU,
- &Extension,
- TRUE);
+ Status = RtlAnsiStringToUnicodeString (&PathU,
+ &Path,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
+
+ Status = RtlAnsiStringToUnicodeString (&FileNameU,
+ &FileName,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
+
+ Status = RtlAnsiStringToUnicodeString (&ExtensionU,
+ &Extension,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
}
else
{
- RtlOemStringToUnicodeString (&PathU,
- &Path,
- TRUE);
- RtlOemStringToUnicodeString (&FileNameU,
- &FileName,
- TRUE);
- RtlOemStringToUnicodeString (&ExtensionU,
- &Extension,
- TRUE);
+ Status = RtlOemStringToUnicodeString (&PathU,
+ &Path,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
+ Status = RtlOemStringToUnicodeString (&FileNameU,
+ &FileName,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
+
+ Status = RtlOemStringToUnicodeString (&ExtensionU,
+ &Extension,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ goto Cleanup;
}
- BufferU.Length = 0;
BufferU.MaximumLength = nBufferLength * sizeof(WCHAR);
BufferU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
0,
BufferU.MaximumLength);
+ if (BufferU.Buffer == NULL)
+ {
+ Status = STATUS_NO_MEMORY;
+ goto Cleanup;
+ }
- Buffer.Length = 0;
Buffer.MaximumLength = nBufferLength;
Buffer.Buffer = lpBuffer;
@@ -889,16 +908,6 @@
BufferU.Buffer,
&FilePartW);
- RtlFreeHeap (RtlGetProcessHeap (),
- 0,
- PathU.Buffer);
- RtlFreeHeap (RtlGetProcessHeap (),
- 0,
- FileNameU.Buffer);
- RtlFreeHeap (RtlGetProcessHeap (),
- 0,
- ExtensionU.Buffer);
-
if (0 != RetValue)
{
BufferU.Length = wcslen(BufferU.Buffer) *
sizeof(WCHAR);
@@ -913,15 +922,31 @@
FALSE);
/* nul-terminate ascii string */
Buffer.Buffer[BufferU.Length / sizeof(WCHAR)] = '\0';
+
+ if (NULL != lpFilePart && BufferU.Length != 0)
+ {
+ *lpFilePart = strrchr (lpBuffer, '\\') + 1;
+ }
}
+Cleanup:
RtlFreeHeap (RtlGetProcessHeap (),
0,
+ PathU.Buffer);
+ RtlFreeHeap (RtlGetProcessHeap (),
+ 0,
+ FileNameU.Buffer);
+ RtlFreeHeap (RtlGetProcessHeap (),
+ 0,
+ ExtensionU.Buffer);
+ RtlFreeHeap (RtlGetProcessHeap (),
+ 0,
BufferU.Buffer);
- if (NULL != lpFilePart)
+ if (!NT_SUCCESS(Status))
{
- *lpFilePart = strrchr (lpBuffer, '\\') + 1;
+ SetLastErrorByStatus(Status);
+ return 0;
}
return RetValue;
@@ -1032,9 +1057,14 @@
if (lpPath == NULL)
{
- AppPathW = (PWCHAR)
RtlAllocateHeap(GetProcessHeap(),
+ AppPathW = (PWCHAR)
RtlAllocateHeap(RtlGetProcessHeap(),
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
MAX_PATH *
sizeof(WCHAR));
+ if (AppPathW == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return 0;
+ }
wcscat (AppPathW,
NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer);
@@ -1052,11 +1082,12 @@
len += 1 + GetWindowsDirectoryW(&Buffer, 0);
len += 1 + wcslen(AppPathW) * sizeof(WCHAR);
- EnvironmentBufferW = (PWCHAR)
RtlAllocateHeap(GetProcessHeap(),
+ EnvironmentBufferW = (PWCHAR)
RtlAllocateHeap(RtlGetProcessHeap(),
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
len *
sizeof(WCHAR));
if (EnvironmentBufferW == NULL)
{
+ RtlFreeHeap(RtlGetProcessHeap(), 0,
AppPathW);
SetLastError(ERROR_OUTOFMEMORY);
return 0;
}
_____
Modified: trunk/reactos/lib/kernel32/file/npipe.c
--- trunk/reactos/lib/kernel32/file/npipe.c 2005-12-11 19:42:08 UTC
(rev 20078)
+++ trunk/reactos/lib/kernel32/file/npipe.c 2005-12-11 20:04:38 UTC
(rev 20079)
@@ -353,6 +353,16 @@
return FALSE;
}
+ /* Now calculate the total length of the structure and allocate it
*/
+ WaitPipeInfoSize = FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER, Name[0])
+
+ NewName.Length;
+ WaitPipeInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0,
WaitPipeInfoSize);
+ if (WaitPipeInfo == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+
/* Initialize the object attributes */
DPRINT("Opening: %wZ\n", &DevicePath);
InitializeObjectAttributes(&ObjectAttributes,
@@ -374,14 +384,10 @@
DPRINT1("Status: %lx\n", Status);
SetLastErrorByStatus(Status);
RtlFreeUnicodeString(&NamedPipeName);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, WaitPipeInfo);
return(FALSE);
}
- /* Now calculate the total length of the structure and allocate it
*/
- WaitPipeInfoSize = FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER, Name[0])
+
- NewName.Length;
- WaitPipeInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0,
WaitPipeInfoSize);
-
/* Check what timeout we got */
if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT)
{
@@ -1022,6 +1028,11 @@
/* Calculate the buffer space that we'll need and allocate it */
BufferSize = nBufferSize + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER,
Data[0]);
Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
+ if (Buffer == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
/* Tell the driver to seek */
Status = NtFsControlFile(hNamedPipe,
_____
Modified: trunk/reactos/lib/kernel32/file/volume.c
--- trunk/reactos/lib/kernel32/file/volume.c 2005-12-11 19:42:08 UTC
(rev 20078)
+++ trunk/reactos/lib/kernel32/file/volume.c 2005-12-11 20:04:38 UTC
(rev 20079)
@@ -444,7 +444,7 @@
)
{
UNICODE_STRING FileSystemNameU;
- UNICODE_STRING VolumeNameU;
+ UNICODE_STRING VolumeNameU = {0};
ANSI_STRING VolumeName;
ANSI_STRING FileSystemName;
PWCHAR RootPathNameW;
@@ -455,11 +455,14 @@
if (lpVolumeNameBuffer)
{
- VolumeNameU.Length = 0;
VolumeNameU.MaximumLength = nVolumeNameSize * sizeof(WCHAR);
VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
0,
VolumeNameU.MaximumLength);
+ if (VolumeNameU.Buffer == NULL)
+ {
+ goto FailNoMem;
+ }
}
if (lpFileSystemNameBuffer)
@@ -469,6 +472,19 @@
FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
0,
FileSystemNameU.MaximumLength);
+ if (FileSystemNameU.Buffer == NULL)
+ {
+ if (VolumeNameU.Buffer != NULL)
+ {
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ VolumeNameU.Buffer);
+ }
+
+FailNoMem:
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
}
Result = GetVolumeInformationW (RootPathNameW,
@@ -724,6 +740,11 @@
0,
sizeof(FILE_FS_LABEL_INFORMATION) +
LabelLength);
+ if (LabelInfo == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
LabelInfo->VolumeLabelLength = LabelLength;
memcpy(LabelInfo->VolumeLabel,
lpVolumeName,