Error handling when argument file is not ELF object and style(9)
authorSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 13:57:27 +0000 (15:57 +0200)
committerSofian Brabez <sbz@FreeBSD.org>
Mon, 1 Jun 2020 13:57:27 +0000 (15:57 +0200)
elf.c
elf.h
elfdbg.c

diff --git a/elf.c b/elf.c
index 5ee633bc67a9fd2a9b93acec070dbb2c828a00d3..5ae212e851fd3c89fccbff73abbe417727244143 100644 (file)
--- a/elf.c
+++ b/elf.c
@@ -1,3 +1,4 @@
+#include <err.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -13,25 +14,42 @@ elf_init(const char *filename)
 {
     int fd;
     struct stat sb;
-    Elf_Obj *e;
+    Elf_Obj *e = NULL;
+
+    if ((fd = open(filename, O_RDONLY)) == -1)
+        errx(1, "open");
 
-    fd = open(filename, O_RDONLY);
     e = (Elf_Obj *)malloc(sizeof(Elf_Obj));
+    if (e == NULL)
+        errx(1, "malloc");
+
     e->fd = fd;
-    fstat(fd, &sb);
+
+    if (fstat(fd, &sb) == -1)
+        errx(1, "fstat");
+
     e->sb = sb;
 
     e->mm = mmap(NULL, sb.st_size, PROT_READ,  MAP_SHARED, fd, 0);
+    if (e->mm == MAP_FAILED)
+        errx(1, "mmap");
+
     e->ehdr = (Elf_Ehdr *) e->mm;
     e->ehdr_size = e->ehdr->e_ehsize;
 
+    if (e->sb.st_size < sizeof(Elf_Ehdr))
+        errx(1, "not a ELF object");
+
+    if (memcmp(e->ehdr->e_ident, ELFMAG, sizeof(ELFMAG) -1) != 0)
+        errx(1, "not a ELF object");
+
     e->shdr = (Elf_Shdr *) (e->mm + e->ehdr->e_shoff);
     e->shdr_size = e->ehdr->e_shnum;
 
     e->strtab = NULL;
     e->strtab_size = 0;
 
-    return e;
+    return (e);
 }
 
 Elf_Shdr *
@@ -41,26 +59,42 @@ elf_strtab(Elf_Obj *e)
 
     ptr = &e->shdr[e->ehdr->e_shstrndx];
     e->strtab = malloc(ptr->sh_size);
+    if (e->strtab == NULL)
+        errx(1, "malloc %s:%d", __func__, __LINE__);
+
     e->strtab_size = ptr->sh_size;
 
     memcpy(e->strtab, (e->mm + ptr->sh_offset), ptr->sh_size);
 
-    return ptr;
+    return (ptr);
 }
 
 int
 elf_destroy(Elf_Obj *e)
 {
     if (e == NULL)
-        return 1;
+        return (1);
+
+    if (e->mm != NULL)
+        if (munmap(e->mm, e->sb.st_size) == -1)
+            return (1);
 
-    munmap(e->mm, e->sb.st_size);
     close(e->fd);
+
     if (e->strtab != NULL)
         free(e->strtab);
+
     free(e);
 
-    return 0;
+    return (0);
+}
+
+char *
+elf_str_get(Elf_Obj *e, int index) {
+    if (e == NULL || index > e->strtab_size)
+        return (NULL);
+
+    return (&e->strtab[e->shdr[index].sh_name]);
 }
 
 int
@@ -71,13 +105,12 @@ elf_debug(Elf_Obj *e)
     char *section_name = NULL;
 
     for (i=0; i < e->shdr_size; i++) {
-        section_name = &e->strtab[e->shdr[i].sh_name];
+        section_name = elf_str_get(e, i);
         if (strnstr(section_name, debug_prefix, strlen(debug_prefix))) {
-            //printf("%s\n", section_name);
             has_debug++;
         }
-
     }
 
-    return has_debug;
+    return (has_debug);
+}
 }
diff --git a/elf.h b/elf.h
index fa8c6b124923b93bb1746cf454e35b5108c919da..7446f1232cc6d18dd3ebcac0e759ef084ed848e5 100644 (file)
--- a/elf.h
+++ b/elf.h
@@ -2,18 +2,19 @@
 #include <sys/stat.h>
 
 typedef struct Elf_Obj {
-    int         fd;
-    struct stat sb;
-    char        *mm;
-    char        *strtab;
-    size_t      strtab_size;
-    Elf_Ehdr    *ehdr;
-    size_t      ehdr_size;
-    Elf_Shdr    *shdr;
-    size_t      shdr_size;
+    int         fd; /* file descriptor */
+    struct stat sb; /* file stat */
+    char        *mm; /* memory mapping */
+    char        *strtab; /* string table */
+    size_t      strtab_size; /* string table size */
+    Elf_Ehdr    *ehdr; /* header pointer */
+    size_t      ehdr_size; /* header size */
+    Elf_Shdr    *shdr; /* section header pointer */
+    size_t      shdr_size; /* section header size */
 } Elf_Obj;
 
-Elf_Obj *elf_init(const char *filename);
+Elf_Obj *elf_init(const char *);
 int elf_destroy(Elf_Obj *);
 Elf_Shdr *elf_strtab(Elf_Obj *);
+char *elf_str_get(Elf_Obj *, int);
 int elf_debug(Elf_Obj *);
index ca6686df3a30b6f482abbb1e062b2a6167d35467..d54b0d3b3e90d48c8624c4c79561c2b77011ab86 100644 (file)
--- a/elfdbg.c
+++ b/elfdbg.c
@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#include <errno.h>
+#include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -53,6 +53,8 @@ main(int argc, char *argv[])
 
        /* load elf binary in memory */
        e = elf_init(argv[1]);
+    if (e == NULL)
+        errx(EX_DATAERR, "elf_init");
 
        /* load string stable */
        shstr = elf_strtab(e);