From 4f7edd52b41781b13787236e67bfb80dd40dfe22 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Wed, 20 Aug 2025 13:22:47 -0400 Subject: [PATCH 1/5] unify rva checks --- src/coreclr/utilcode/pedecoder.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/coreclr/utilcode/pedecoder.cpp b/src/coreclr/utilcode/pedecoder.cpp index 338c0fc3e07e89..7caf6f564c59da 100644 --- a/src/coreclr/utilcode/pedecoder.cpp +++ b/src/coreclr/utilcode/pedecoder.cpp @@ -497,7 +497,6 @@ CHECK PEDecoder::CheckRva(RVA rva, COUNT_T size, int forbiddenFlags, IsNullOK ok CHECK(section != NULL); CHECK(CheckBounds(VAL32(section->VirtualAddress), - // AlignUp((UINT)VAL32(section->Misc.VirtualSize), (UINT)VAL32(FindNTHeaders()->OptionalHeader.SectionAlignment)), (UINT)VAL32(section->Misc.VirtualSize), rva, size)); if(!IsMapped()) @@ -776,8 +775,10 @@ IMAGE_SECTION_HEADER *PEDecoder::RvaToSection(RVA rva) const while (section < sectionEnd) { - if (rva < (VAL32(section->VirtualAddress) - + AlignUp((UINT)VAL32(section->Misc.VirtualSize), (UINT)VAL32(FindNTHeaders()->OptionalHeader.SectionAlignment)))) + // The RVA should be within a section's virtual address range. + // On flat images (!IsMapped()), the RVA should also be within the section's raw data range. + if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize)) && + (IsMapped() || rva < (VAL32(section->VirtualAddress) + VAL32(section->SizeOfRawData)))) { if (rva < VAL32(section->VirtualAddress)) RETURN NULL; From 9112a10fbce32b86dc47e98763307d383b6ea40c Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Wed, 20 Aug 2025 13:52:45 -0400 Subject: [PATCH 2/5] remove comment --- src/coreclr/utilcode/pedecoder.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/utilcode/pedecoder.cpp b/src/coreclr/utilcode/pedecoder.cpp index 7caf6f564c59da..cd28ead6f7afd5 100644 --- a/src/coreclr/utilcode/pedecoder.cpp +++ b/src/coreclr/utilcode/pedecoder.cpp @@ -848,7 +848,6 @@ TADDR PEDecoder::GetRvaData(RVA rva, IsNullOK ok /*= NULL_NOT_OK*/) const offset = rva; else { - // !!! check for case where rva is in padded portion of segment offset = RvaToOffset(rva); } From ba9c7142f5f09fec96a20bce29a4acc82f41bc42 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 20 Aug 2025 11:09:12 -0700 Subject: [PATCH 3/5] Update src/coreclr/utilcode/pedecoder.cpp --- src/coreclr/utilcode/pedecoder.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/coreclr/utilcode/pedecoder.cpp b/src/coreclr/utilcode/pedecoder.cpp index cd28ead6f7afd5..2fd25c6c74a44f 100644 --- a/src/coreclr/utilcode/pedecoder.cpp +++ b/src/coreclr/utilcode/pedecoder.cpp @@ -776,10 +776,16 @@ IMAGE_SECTION_HEADER *PEDecoder::RvaToSection(RVA rva) const while (section < sectionEnd) { // The RVA should be within a section's virtual address range. - // On flat images (!IsMapped()), the RVA should also be within the section's raw data range. - if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize)) && - (IsMapped() || rva < (VAL32(section->VirtualAddress) + VAL32(section->SizeOfRawData)))) + if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize)) { + if (!sMapped()) + { + // On flat images (!IsMapped()), the RVA should also be within the section's raw data range. + if (rva >= (VAL32(section->VirtualAddress) + VAL32(section->SizeOfRawData))) + { + return NULL; + } + } if (rva < VAL32(section->VirtualAddress)) RETURN NULL; else From d80dcbe0bae5380614afd19570f976ec66ccb764 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 20 Aug 2025 12:04:00 -0700 Subject: [PATCH 4/5] Update src/coreclr/utilcode/pedecoder.cpp --- src/coreclr/utilcode/pedecoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/utilcode/pedecoder.cpp b/src/coreclr/utilcode/pedecoder.cpp index 2fd25c6c74a44f..fb954526daa0ec 100644 --- a/src/coreclr/utilcode/pedecoder.cpp +++ b/src/coreclr/utilcode/pedecoder.cpp @@ -776,7 +776,7 @@ IMAGE_SECTION_HEADER *PEDecoder::RvaToSection(RVA rva) const while (section < sectionEnd) { // The RVA should be within a section's virtual address range. - if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize)) + if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize))) { if (!sMapped()) { From 5917d2b74801c973bf88977e4a90bc6274a711c1 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 20 Aug 2025 12:15:53 -0700 Subject: [PATCH 5/5] Update src/coreclr/utilcode/pedecoder.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/coreclr/utilcode/pedecoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/utilcode/pedecoder.cpp b/src/coreclr/utilcode/pedecoder.cpp index fb954526daa0ec..810912db910d76 100644 --- a/src/coreclr/utilcode/pedecoder.cpp +++ b/src/coreclr/utilcode/pedecoder.cpp @@ -778,7 +778,7 @@ IMAGE_SECTION_HEADER *PEDecoder::RvaToSection(RVA rva) const // The RVA should be within a section's virtual address range. if (rva < (VAL32(section->VirtualAddress) + VAL32(section->Misc.VirtualSize))) { - if (!sMapped()) + if (!IsMapped()) { // On flat images (!IsMapped()), the RVA should also be within the section's raw data range. if (rva >= (VAL32(section->VirtualAddress) + VAL32(section->SizeOfRawData)))