Validate program type in ebpf_program_create (#2628)

* Validate program type in ebpf_program_create

* Fixed unit_test for EBPF_OPERATION_GET_PROGRAM_INFO return for invalid program type

* Add trace for EBPF_EXTENSION_FAILED_TO_LOAD

* Updated the retval in ebpf_program.h
This commit is contained in:
Sharmi 2023-06-26 15:27:38 -07:00 коммит произвёл GitHub
Родитель 352067110b
Коммит 6544208724
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 20 добавлений и 2 удалений

Просмотреть файл

@ -648,13 +648,23 @@ ebpf_program_create(_In_ const ebpf_program_parameters_t* program_parameters, _O
{
EBPF_LOG_ENTRY();
ebpf_result_t retval;
ebpf_program_t* local_program;
ebpf_program_t* local_program = NULL;
ebpf_utf8_string_t local_program_name = {NULL, 0};
ebpf_utf8_string_t local_section_name = {NULL, 0};
ebpf_utf8_string_t local_file_name = {NULL, 0};
ebpf_utf8_string_t local_hash_type_name = {NULL, 0};
uint8_t* local_program_info_hash = NULL;
if (IsEqualGUID(&program_parameters->program_type, &EBPF_PROGRAM_TYPE_UNSPECIFIED)) {
EBPF_LOG_MESSAGE_GUID(
EBPF_TRACELOG_LEVEL_ERROR,
EBPF_TRACELOG_KEYWORD_PROGRAM,
"Program type must be specified.",
&program_parameters->program_type);
retval = EBPF_INVALID_ARGUMENT;
goto Done;
}
local_program = (ebpf_program_t*)ebpf_allocate_with_tag(sizeof(ebpf_program_t), EBPF_POOL_TAG_PROGRAM);
if (!local_program) {
retval = EBPF_NO_MEMORY;
@ -781,6 +791,12 @@ ebpf_program_create(_In_ const ebpf_program_parameters_t* program_parameters, _O
}
if (local_program->general_helper_provider_data == NULL || local_program->info_extension_provider_data == NULL) {
EBPF_LOG_MESSAGE_GUID_GUID(
EBPF_TRACELOG_LEVEL_INFO,
EBPF_TRACELOG_KEYWORD_PROGRAM,
"Program type and Attach type:",
&program_parameters->program_type,
&program_parameters->expected_attach_type);
retval = EBPF_EXTENSION_FAILED_TO_LOAD;
goto Done;
}

Просмотреть файл

@ -68,6 +68,8 @@ extern "C"
* @retval EBPF_SUCCESS The operation was successful.
* @retval EBPF_NO_MEMORY Unable to allocate resources for this
* program instance.
* @retval EBPF_INVALID_ARGUMENT Program type was not set or Program name length was greater than BPF_OBJ_NAME_LEN.
* @retval EBPF_EXTENSION_FAILED_TO_LOAD The program extension failed to load.
*/
_Must_inspect_result_ ebpf_result_t
ebpf_program_create(_In_ const ebpf_program_parameters_t* program_parameters, _Outptr_ ebpf_program_t** program);

Просмотреть файл

@ -1680,7 +1680,7 @@ TEST_CASE("EBPF_OPERATION_GET_PROGRAM_INFO", "[execution_context][negative]")
// Invalid program handle and type.
request.program_handle = ebpf_handle_invalid;
request.program_type = {0};
REQUIRE(invoke_protocol(EBPF_OPERATION_GET_PROGRAM_INFO, request, reply) == EBPF_EXTENSION_FAILED_TO_LOAD);
REQUIRE(invoke_protocol(EBPF_OPERATION_GET_PROGRAM_INFO, request, reply) == EBPF_INVALID_ARGUMENT);
// Reply too small.
request.program_handle = program_handles[0];