Skip to content

Commit 8090b55

Browse files
committed
Check size before memcpy
1 parent 86b4bea commit 8090b55

2 files changed

Lines changed: 77 additions & 8 deletions

File tree

extension/runner_util/inputs.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,47 @@ Result<BufferCleanup> prepare_input_tensors(
8686
Debug, "Verifying and setting input for non-tensor input %zu", i);
8787

8888
if (tag.get() == Tag::Int) {
89-
int64_t int_input;
90-
std::memcpy(&int_input, buffer, buffer_size);
91-
err = method.set_input(runtime::EValue(int_input), i);
89+
if (buffer_size != sizeof(int64_t)) {
90+
ET_LOG(
91+
Error,
92+
"Int input at index %zu has size %zu, expected sizeof(int64_t) %zu",
93+
i,
94+
buffer_size,
95+
sizeof(int64_t));
96+
err = Error::InvalidArgument;
97+
} else {
98+
int64_t int_input;
99+
std::memcpy(&int_input, buffer, buffer_size);
100+
err = method.set_input(runtime::EValue(int_input), i);
101+
}
92102
} else if (tag.get() == Tag::Double) {
93-
double double_input;
94-
std::memcpy(&double_input, buffer, buffer_size);
95-
err = method.set_input(runtime::EValue(double_input), i);
103+
if (buffer_size != sizeof(double)) {
104+
ET_LOG(
105+
Error,
106+
"Double input at index %zu has size %zu, expected sizeof(double) %zu",
107+
i,
108+
buffer_size,
109+
sizeof(double));
110+
err = Error::InvalidArgument;
111+
} else {
112+
double double_input;
113+
std::memcpy(&double_input, buffer, buffer_size);
114+
err = method.set_input(runtime::EValue(double_input), i);
115+
}
96116
} else if (tag.get() == Tag::Bool) {
97117
bool bool_input;
98-
std::memcpy(&bool_input, buffer, buffer_size);
99-
err = method.set_input(runtime::EValue(bool_input), i);
118+
if (buffer_size != sizeof(bool)) {
119+
ET_LOG(
120+
Error,
121+
"Bool input at index %zu has size %zu, expected sizeof(bool) %zu",
122+
i,
123+
buffer_size,
124+
sizeof(bool));
125+
err = Error::InvalidArgument;
126+
} else {
127+
std::memcpy(&bool_input, buffer, buffer_size);
128+
err = method.set_input(runtime::EValue(bool_input), i);
129+
}
100130
} else {
101131
ET_LOG(
102132
Error,

extension/runner_util/test/inputs_test.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,42 @@ TEST(BufferCleanupTest, Smoke) {
186186
// complaint.
187187
bc2.reset();
188188
}
189+
190+
TEST_F(InputsTest, DoubleInputWrongSizeFails) {
191+
MethodMeta method_meta = method_->method_meta();
192+
193+
// ModuleAdd has 3 inputs: tensor, tensor, double (alpha)
194+
ASSERT_EQ(method_meta.num_inputs(), 3);
195+
196+
// Verify input 2 is a Double
197+
auto tag = method_meta.input_tag(2);
198+
ASSERT_TRUE(tag.ok());
199+
ASSERT_EQ(tag.get(), Tag::Double);
200+
201+
// Create input_buffers with wrong size for the Double input
202+
std::vector<std::pair<char*, size_t>> input_buffers;
203+
204+
// Allocate correct buffers for tensors (inputs 0 and 1)
205+
auto tensor0_meta = method_meta.input_tensor_meta(0);
206+
auto tensor1_meta = method_meta.input_tensor_meta(1);
207+
ASSERT_TRUE(tensor0_meta.ok());
208+
ASSERT_TRUE(tensor1_meta.ok());
209+
210+
std::vector<char> buf0(tensor0_meta->nbytes());
211+
std::vector<char> buf1(tensor1_meta->nbytes());
212+
213+
// ModuleAdd expects alpha=1.0. Need to set this correctly, otherwise
214+
// set_input fails validation before the buffer overflow happens.
215+
double alpha = 1.0;
216+
// Double is size 8; use a larger buffer to invoke overflow.
217+
char large_buffer[16];
218+
memcpy(large_buffer, &alpha, sizeof(double));
219+
220+
input_buffers.push_back({buf0.data(), buf0.size()});
221+
input_buffers.push_back({buf1.data(), buf1.size()});
222+
input_buffers.push_back({large_buffer, sizeof(large_buffer)});
223+
224+
Result<BufferCleanup> result =
225+
prepare_input_tensors(*method_, {}, input_buffers);
226+
EXPECT_EQ(result.error(), Error::InvalidArgument);
227+
}

0 commit comments

Comments
 (0)