]> git.ipfire.org Git - pakfire.git/commitdiff
ELF: Move the PIE check
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Jan 2025 17:28:59 +0000 (17:28 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Jan 2025 17:28:59 +0000 (17:28 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/elf.c
src/libpakfire/include/pakfire/elf.h
src/libpakfire/linter-file.c

index 878d493a3148bfdefdc515fd6944cf1e45787a88..833e2fefb5b4ef1b5517ecc0bfeba1417f803255 100644 (file)
@@ -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;
 
index c4d2376d9dab1ca70bd08dd32275a47cffc7e24e..b97b6a501231832d6214288eeaba57f1dc26e3b3 100644 (file)
@@ -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 */
index dfc984b37cf5de681328d56007ae4e9532c98212..42f92c55b3b17a51a0bdf2c27a29051d32c22d54 100644 (file)
@@ -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) {