]> git.ipfire.org Git - pakfire.git/commitdiff
ELF: Read the number of program headers only once
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Jan 2025 08:30:58 +0000 (08:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Jan 2025 08:30:58 +0000 (08:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/elf.c

index 148cf254f408c1d1325a15312521b211d4cbbb5d..10f25a22b796ef1c0682737cbd6aef926ae09683 100644 (file)
@@ -49,6 +49,9 @@ struct pakfire_elf {
        // ELF Header
        GElf_Ehdr ehdr;
 
+       // Number of Program Headers
+       size_t phnum;
+
        // Strings
        size_t shstrndx;
 
@@ -102,6 +105,14 @@ static int pakfire_elf_open_elf(struct pakfire_elf* self) {
                return -EINVAL;
        }
 
+       // Fetch the total numbers of program headers
+       r = elf_getphdrnum(self->elf, &self->phnum);
+       if (r) {
+               ERROR(self->ctx,
+                       "Could not fetch number of program headers: %s\n", elf_errmsg(-1));
+               return -EINVAL;
+       }
+
        // Find the strings
        r = elf_getshdrstrndx(self->elf, &self->shstrndx);
        if (r < 0) {
@@ -471,20 +482,9 @@ int pakfire_elf_has_ssp(struct pakfire_elf* self) {
 
 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++) {
+       for (unsigned int i = 0; i < self->phnum; i++) {
                if (!gelf_getphdr(self->elf, i, &phdr)) {
                        ERROR(self->ctx, "Could not parse program header: %s\n", elf_errmsg(-1));
                        return -ENOTSUP;