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;
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 */
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);
}
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) {