return 0;
}
+int pakfire_elf_has_execstack(struct pakfire_elf* self) {
+ GElf_Phdr phdr;
+ int r;
+
+ size_t phnum = 0;
+
+ // Fetch the total numbers of program headers
+ r = elf_getphdrnum(self->elf, &phnum);
+ if (r) {
+ ERROR(self->ctx,
+ "Could not fetch number of program headers: %s\n", elf_errmsg(-1));
+ return -EINVAL;
+ }
+
+ // Walk through all program headers
+ for (unsigned int i = 0; i < phnum; i++) {
+ if (!gelf_getphdr(self->elf, i, &phdr)) {
+ ERROR(self->ctx, "Could not parse program header: %s\n", elf_errmsg(-1));
+ return -ENOTSUP;
+ }
+
+ switch (phdr.p_type) {
+ case PT_GNU_STACK:
+ DEBUG(self->ctx,
+ "%s: GNU_STACK flags: %c%c%c\n",
+ self->path,
+ (phdr.p_flags & PF_R) ? 'R' : '-',
+ (phdr.p_flags & PF_W) ? 'W' : '-',
+ (phdr.p_flags & PF_X) ? 'X' : '-'
+ );
+
+ // The stack cannot be writable and executable
+ if ((phdr.p_flags & PF_W) && (phdr.p_flags & PF_X))
+ return 1;
+
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
int pakfire_elf_is_stripped(struct pakfire_elf* self) {
Elf_Scn* symtab = NULL;
int pakfire_elf_is_pie(struct pakfire_elf* self);
int pakfire_elf_has_ssp(struct pakfire_elf* self);
+int pakfire_elf_has_execstack(struct pakfire_elf* self);
int pakfire_elf_is_stripped(struct pakfire_elf* self);
#endif /* PAKFIRE_PRIVATE */
}
static int pakfire_linter_file_check_execstack(struct pakfire_linter_file* lfile) {
- GElf_Phdr phdr;
- int r;
-
- size_t phnum = 0;
-
- // Fetch the total numbers of program headers
- r = elf_getphdrnum(lfile->elf, &phnum);
- if (r) {
- ERROR(lfile->ctx,
- "Could not fetch number of program headers: %s\n", elf_errmsg(-1));
- return -EINVAL;
- }
-
- // Walk through all program headers
- for (unsigned int i = 0; i < phnum; i++) {
- if (!gelf_getphdr(lfile->elf, i, &phdr)) {
- ERROR(lfile->ctx, "Could not parse program header: %s\n", elf_errmsg(-1));
- return -ENOTSUP;
- }
-
- switch (phdr.p_type) {
- case PT_GNU_STACK:
- DEBUG(lfile->ctx,
- "%s: GNU_STACK flags: %c%c%c\n",
- lfile->path,
- (phdr.p_flags & PF_R) ? 'R' : '-',
- (phdr.p_flags & PF_W) ? 'W' : '-',
- (phdr.p_flags & PF_X) ? 'X' : '-'
- );
-
- // The stack cannot be writable and executable
- if ((phdr.p_flags & PF_W) && (phdr.p_flags & PF_X))
- return pakfire_linter_file_error(lfile, "Executable Stack");
-
- default:
- break;
- }
- }
+ if (pakfire_elf_has_execstack(lfile->_elf))
+ return pakfire_linter_file_error(lfile, "Executable Stack");
return 0;
}