[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:
Ahmed Arif
2026-05-18 23:48:41 +02:00
committed by GitHub
parent 4da86123f4
commit 0e64048812
4 changed files with 14 additions and 10 deletions
-2
View File
@@ -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
+2 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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));