From b0cae74bb91e4636f1aa392555bae706c79b0377 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 7 Dec 2019 18:13:16 -0800 Subject: [PATCH] ro: bss size is allowed to be zero --- stratosphere/ro/source/impl/ro_service_impl.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/stratosphere/ro/source/impl/ro_service_impl.cpp b/stratosphere/ro/source/impl/ro_service_impl.cpp index 1742b7516..16500a629 100644 --- a/stratosphere/ro/source/impl/ro_service_impl.cpp +++ b/stratosphere/ro/source/impl/ro_service_impl.cpp @@ -286,7 +286,7 @@ namespace ams::ro::impl { } } - constexpr inline Result ValidateAddressAndSize(u64 address, u64 size) { + constexpr inline Result ValidateAddressAndNonZeroSize(u64 address, u64 size) { R_UNLESS(util::IsAligned(address, os::MemoryPageSize), ResultInvalidAddress()); R_UNLESS(size != 0, ResultInvalidSize()); R_UNLESS(util::IsAligned(size, os::MemoryPageSize), ResultInvalidSize()); @@ -294,6 +294,13 @@ namespace ams::ro::impl { return ResultSuccess(); } + constexpr inline Result ValidateAddressAndSize(u64 address, u64 size) { + R_UNLESS(util::IsAligned(address, os::MemoryPageSize), ResultInvalidAddress()); + R_UNLESS(util::IsAligned(size, os::MemoryPageSize), ResultInvalidSize()); + R_UNLESS(size == 0 || address < address + size, ResultInvalidSize()); + return ResultSuccess(); + } + } /* Access utilities. */ @@ -366,7 +373,7 @@ namespace ams::ro::impl { const ncm::ProgramId program_id = context->GetProgramId(process_h); /* Validate address/size. */ - R_TRY(ValidateAddressAndSize(nrr_address, nrr_size)); + R_TRY(ValidateAddressAndNonZeroSize(nrr_address, nrr_size)); /* Check we have space for a new NRR. */ NrrInfo *nrr_info = nullptr; @@ -415,7 +422,7 @@ namespace ams::ro::impl { AMS_ASSERT(context != nullptr); /* Validate address/size. */ - R_TRY(ValidateAddressAndSize(nro_address, nro_size)); + R_TRY(ValidateAddressAndNonZeroSize(nro_address, nro_size)); R_TRY(ValidateAddressAndSize(bss_address, bss_size)); const u64 total_size = nro_size + bss_size;