mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[NDK][RTL] Fix packing leak and ARM64 heap layouts (#9020)
Stop `PS_JOB_TOKEN_FILTER`'s pack(1) scope from leaking into `EJOB`, which misaligns kernel fields on ARM64. Use the Win64 heap entry layout on ARM64 and assert the heap metadata offsets verified against NT ARM64 symbols. Keep heap alignment masks pointer-sized and size `STACK_TRACE_DATABASE` `ERESOURCE` padding for all Win64 targets. CORE-18200
This commit is contained in:
@@ -1546,7 +1546,6 @@ typedef struct _EPROCESS
|
||||
//
|
||||
// Job Token Filter Data
|
||||
//
|
||||
#include <pshpack1.h>
|
||||
typedef struct _PS_JOB_TOKEN_FILTER
|
||||
{
|
||||
ULONG CapturedSidCount;
|
||||
@@ -1617,7 +1616,6 @@ typedef struct _EJOB
|
||||
ULONG MemberLevel;
|
||||
ULONG JobFlags;
|
||||
} EJOB, *PEJOB;
|
||||
#include <poppack.h>
|
||||
|
||||
//
|
||||
// Job Information Structures for NtQueryInformationJobObject
|
||||
|
||||
@@ -1788,7 +1788,7 @@ typedef struct _STACK_TRACE_DATABASE
|
||||
PVOID Lock;
|
||||
|
||||
/* Padding for ERESOURCE */
|
||||
#if defined(_M_AMD64)
|
||||
#ifdef _WIN64
|
||||
UCHAR Padding[0x68];
|
||||
#else
|
||||
UCHAR Padding[56];
|
||||
@@ -1814,9 +1814,7 @@ typedef struct _STACK_TRACE_DATABASE
|
||||
|
||||
// Validate that our padding is big enough:
|
||||
#ifndef NTOS_MODE_USER
|
||||
#if defined(_M_AMD64)
|
||||
C_ASSERT(sizeof(ERESOURCE) <= 0x68);
|
||||
#elif defined(_M_ARM64)
|
||||
#ifdef _WIN64
|
||||
C_ASSERT(sizeof(ERESOURCE) <= 0x68);
|
||||
#else
|
||||
C_ASSERT(sizeof(ERESOURCE) <= 56);
|
||||
|
||||
+2
-2
@@ -196,12 +196,12 @@ RtlpInitializeHeap(OUT PHEAP Heap,
|
||||
/* Initialise the Heap alignment info */
|
||||
if (Flags & HEAP_CREATE_ALIGN_16)
|
||||
{
|
||||
Heap->AlignMask = (ULONG) ~15;
|
||||
Heap->AlignMask = ~(ULONG_PTR)15;
|
||||
Heap->AlignRound = 15 + sizeof(HEAP_ENTRY);
|
||||
}
|
||||
else
|
||||
{
|
||||
Heap->AlignMask = (ULONG) ~(sizeof(HEAP_ENTRY) - 1);
|
||||
Heap->AlignMask = ~(ULONG_PTR)(sizeof(HEAP_ENTRY) - 1);
|
||||
Heap->AlignRound = 2 * sizeof(HEAP_ENTRY) - 1;
|
||||
}
|
||||
|
||||
|
||||
+10
-2
@@ -77,7 +77,7 @@ RtlpHeapIsSpecial(ULONG Flags)
|
||||
/* Heap structures */
|
||||
struct _HEAP_COMMON_ENTRY
|
||||
{
|
||||
#ifdef _M_AMD64
|
||||
#ifdef _WIN64
|
||||
PVOID PreviousBlockPrivateData;
|
||||
#endif
|
||||
union
|
||||
@@ -90,7 +90,7 @@ struct _HEAP_COMMON_ENTRY
|
||||
};
|
||||
struct
|
||||
{
|
||||
#ifndef _M_AMD64
|
||||
#ifndef _WIN64
|
||||
PVOID SubSegmentCode;
|
||||
#else
|
||||
ULONG SubSegmentCodeDummy;
|
||||
@@ -139,8 +139,16 @@ typedef struct _HEAP_ENTRY
|
||||
|
||||
#ifdef _WIN64
|
||||
C_ASSERT(sizeof(HEAP_ENTRY) == 16);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, Size) == 8);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, Flags) == 10);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, PreviousSize) == 12);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, UnusedBytes) == 15);
|
||||
#else
|
||||
C_ASSERT(sizeof(HEAP_ENTRY) == 8);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, Size) == 0);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, Flags) == 2);
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, PreviousSize) == sizeof(PVOID));
|
||||
C_ASSERT(FIELD_OFFSET(HEAP_ENTRY, UnusedBytes) == sizeof(PVOID) + 3);
|
||||
#endif
|
||||
C_ASSERT((1 << HEAP_ENTRY_SHIFT) == sizeof(HEAP_ENTRY));
|
||||
C_ASSERT((2 << HEAP_ENTRY_SHIFT) == sizeof(HEAP_FREE_ENTRY));
|
||||
|
||||
Reference in New Issue
Block a user