Skip to content

Commit ae5b743

Browse files
committed
Validate protection flag in DEVDAX provider params
1 parent 9f7fe4b commit ae5b743

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/provider/provider_devdax_memory.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,16 @@ umf_result_t umfDevDaxMemoryProviderParamsSetProtection(
641641
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
642642
}
643643

644+
// verify that protection contains only valid bits set
645+
// (UMF_PROTECTION_MAX-1) - highest possible bit
646+
// (UMF_PROTECTION_MAX-1) << 1 - next after highest possible bit
647+
// ((UMF_PROTECTION_MAX-1) << 1) - 1 - all valid bits set
648+
const unsigned VALID_FLAGS_ALL = ((UMF_PROTECTION_MAX - 1) << 1) - 1;
649+
if (protection & ~VALID_FLAGS_ALL || protection == 0) {
650+
LOG_ERR("Incorrect memory protection flags: %u", protection);
651+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
652+
}
653+
644654
hParams->protection = protection;
645655

646656
return UMF_RESULT_SUCCESS;

test/provider_devdax_memory.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,47 @@ TEST_P(umfProviderTest, purge_force_INVALID_POINTER) {
326326
UMF_DEVDAX_RESULT_ERROR_PURGE_FORCE_FAILED);
327327
}
328328

329-
// negative tests
329+
// params tests
330+
331+
TEST_F(test, params_protection_flag) {
332+
umf_devdax_memory_provider_params_handle_t params = nullptr;
333+
umf_result_t ret =
334+
umfDevDaxMemoryProviderParamsCreate(&params, "/dev/dax0.0", 4096);
335+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
336+
ASSERT_NE(params, nullptr);
337+
338+
//test all valid combinations
339+
for (unsigned protection = UMF_PROTECTION_NONE;
340+
protection < (UMF_PROTECTION_MAX - 1) << 1; ++protection) {
341+
ret = umfDevDaxMemoryProviderParamsSetProtection(params, protection);
342+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
343+
}
344+
345+
umfDevDaxMemoryProviderParamsDestroy(params);
346+
}
347+
348+
// negative params tests
349+
350+
TEST_F(test, params_invalid_protection_flag) {
351+
umf_devdax_memory_provider_params_handle_t params = nullptr;
352+
umf_result_t ret =
353+
umfDevDaxMemoryProviderParamsCreate(&params, "/dev/dax0.0", 4096);
354+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
355+
ASSERT_NE(params, nullptr);
356+
357+
ret = umfDevDaxMemoryProviderParamsSetProtection(params, 0);
358+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
359+
360+
for (unsigned protection = UMF_PROTECTION_NONE;
361+
protection < (UMF_PROTECTION_MAX - 1) << 1; ++protection) {
362+
unsigned invalid_protection = protection | (UMF_PROTECTION_MAX << 1);
363+
ret = umfDevDaxMemoryProviderParamsSetProtection(params,
364+
invalid_protection);
365+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
366+
}
367+
368+
umfDevDaxMemoryProviderParamsDestroy(params);
369+
}
330370

331371
TEST_F(test, params_null_handle) {
332372
auto ret =

0 commit comments

Comments
 (0)