Skip to content

Commit 12b768c

Browse files
committed
Verify pte size at runtime
Check that the file size is at least the size of what we expect from the extended header. ie. header_offset + program_size + segment_data_size. Differential Revision: [D81938296](https://our.internmc.facebook.com/intern/diff/D81938296/) [ghstack-poisoned]
1 parent 8c584b7 commit 12b768c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

runtime/executor/program.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ Result<executorch_flatbuffer::ExecutionPlan*> get_execution_plan(
6767
// See if the program size is in the header.
6868
size_t program_size = 0;
6969
size_t segment_base_offset = 0;
70+
size_t segment_data_size = 0;
7071
{
7172
EXECUTORCH_SCOPE_PROF("Program::check_header");
7273
Result<FreeableBuffer> header = loader->load(
@@ -82,6 +83,25 @@ Result<executorch_flatbuffer::ExecutionPlan*> get_execution_plan(
8283
// The header has the program size.
8384
program_size = eh->program_size;
8485
segment_base_offset = eh->segment_base_offset;
86+
segment_data_size = eh->segment_data_size;
87+
88+
// Check the expected file size in two cases:
89+
// 1. segment_base_offset == 0 && segment_data_size == 0: this indicates
90+
// there are no segments.
91+
// 2. segment_data_size > 0; a 0 value may indicate that the field was
92+
// not set, e.g. on older PTE files.
93+
if ((segment_data_size == 0 && segment_base_offset == 0) ||
94+
segment_data_size > 0) {
95+
size_t expected =
96+
ExtendedHeader::kHeaderOffset + program_size + segment_data_size;
97+
size_t actual = loader->size().get();
98+
ET_CHECK_OR_RETURN_ERROR(
99+
expected <= actual,
100+
InvalidProgram,
101+
"File size is too small. Expected file size from extended header is %zu, actual file size from data loader is %zu",
102+
expected,
103+
actual);
104+
}
85105
} else if (eh.error() == Error::NotFound) {
86106
// No header; the program consumes the whole file, and there are no
87107
// segments.

runtime/executor/test/program_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,3 +574,22 @@ TEST_F(ProgramTest, LoadFromMutableSegment) {
574574
&program.get(), 500, 1, 1, buffer);
575575
EXPECT_NE(err, Error::Ok);
576576
}
577+
578+
TEST_F(ProgramTest, LoadAndCheckPTESize) {
579+
// Load the serialized ModuleAddMul data, with constants in the segment.
580+
const char* linear_path = std::getenv("ET_MODULE_ADD_MUL_PATH");
581+
Result<FileDataLoader> linear_loader = FileDataLoader::from(linear_path);
582+
ASSERT_EQ(linear_loader.error(), Error::Ok);
583+
Result<Program> program = Program::load(&linear_loader.get());
584+
ASSERT_EQ(program.error(), Error::Ok);
585+
586+
// Create a truncated file.
587+
Result<FreeableBuffer> truncated_file = linear_loader->load(
588+
0, 200, DataLoader::SegmentInfo(DataLoader::SegmentInfo::Type::Program));
589+
ASSERT_EQ(truncated_file.error(), Error::Ok);
590+
591+
Result<BufferDataLoader> truncated_loader =
592+
BufferDataLoader(truncated_file->data(), 200);
593+
Result<Program> truncated_program = Program::load(&truncated_loader.get());
594+
ASSERT_EQ(truncated_program.error(), Error::InvalidProgram);
595+
}

0 commit comments

Comments
 (0)