From: Michael Tremer Date: Wed, 1 Jan 2025 17:28:59 +0000 (+0000) Subject: ELF: Move the PIE check X-Git-Tag: 0.9.30~599 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4f4e71d2218b43e7cf7eb8977174f46eaf3b6f32;p=pakfire.git ELF: Move the PIE check Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/elf.c b/src/libpakfire/elf.c index 878d493a3..833e2fefb 100644 --- a/src/libpakfire/elf.c +++ b/src/libpakfire/elf.c @@ -286,6 +286,20 @@ static int pakfire_elf_get_section(struct pakfire_elf* self, return 1; } +int pakfire_elf_is_pie(struct pakfire_elf* self) { + switch (pakfire_elf_type(self)) { + // Shared Object files are good + case ET_DYN: + return 1; + + // Everything else is bad + default: + break; + } + + return 0; +} + int pakfire_elf_is_stripped(struct pakfire_elf* self) { Elf_Scn* symtab = NULL; diff --git a/src/libpakfire/include/pakfire/elf.h b/src/libpakfire/include/pakfire/elf.h index c4d2376d9..b97b6a501 100644 --- a/src/libpakfire/include/pakfire/elf.h +++ b/src/libpakfire/include/pakfire/elf.h @@ -42,6 +42,7 @@ int pakfire_elf_type(struct pakfire_elf* self); const char* pakfire_elf_build_id(struct pakfire_elf* self); const char* pakfire_elf_debuglink(struct pakfire_elf* self); +int pakfire_elf_is_pie(struct pakfire_elf* self); int pakfire_elf_is_stripped(struct pakfire_elf* self); #endif /* PAKFIRE_PRIVATE */ diff --git a/src/libpakfire/linter-file.c b/src/libpakfire/linter-file.c index dfc984b37..42f92c55b 100644 --- a/src/libpakfire/linter-file.c +++ b/src/libpakfire/linter-file.c @@ -346,22 +346,6 @@ static int pakfire_linter_check_script_interpreter(struct pakfire_linter_file* l return 0; } -static int pakfire_linter_file_get_elf_type(struct pakfire_linter_file* lfile) { - GElf_Ehdr ehdr = {}; - - // Check if have an ELF object - if (!lfile->elf) - return -EINVAL; - - // Fetch the ELF header - if (!gelf_getehdr(lfile->elf, &ehdr)) { - ERROR(lfile->ctx, "Could not parse ELF header: %s\n", elf_errmsg(-1)); - return -EINVAL; - } - - return ehdr.e_type; -} - typedef int (*__pakfire_linter_file_for_elf_section_callback)(struct pakfire_linter_file* lfile, const Elf_Scn* section, const GElf_Shdr* shdr, Elf_Data* data); @@ -464,17 +448,10 @@ static int pakfire_linter_file_elf_dyn_walk(struct pakfire_linter_file* lfile, } static int pakfire_linter_file_check_pie(struct pakfire_linter_file* lfile) { - switch (pakfire_linter_file_get_elf_type(lfile)) { - // Shared Object files are good - case ET_DYN: - return 0; + if (!pakfire_elf_is_pie(lfile->_elf)) + return pakfire_linter_file_error(lfile, "Missing PIE"); - // Everything else is bad - default: - break; - } - - return pakfire_linter_file_error(lfile, "Missing PIE"); + return 0; } static int pakfire_linter_file_check_ssp(struct pakfire_linter_file* lfile) {