From ae1d534074286bb6c206a13b7b07503ee458396a Mon Sep 17 00:00:00 2001 From: smitsohu Date: Sat, 13 Mar 2021 21:20:38 +0100 Subject: appimage: calculate elf offset from file descriptor --- src/firejail/appimage.c | 2 +- src/firejail/appimage_size.c | 22 ++++++++-------------- src/firejail/firejail.h | 2 +- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/firejail/appimage.c b/src/firejail/appimage.c index cc66608d3..59758bf2d 100644 --- a/src/firejail/appimage.c +++ b/src/firejail/appimage.c @@ -61,7 +61,7 @@ void appimage_set(const char *appimage) { // get appimage type and ELF size // a value of 0 means we are dealing with a type1 appimage - size = appimage2_size(appimage); + size = appimage2_size(ffd); if (arg_debug) printf("AppImage ELF size %lu\n", size); diff --git a/src/firejail/appimage_size.c b/src/firejail/appimage_size.c index 4640cb8a5..43ca501da 100644 --- a/src/firejail/appimage_size.c +++ b/src/firejail/appimage_size.c @@ -132,22 +132,20 @@ static long unsigned int read_elf64(int fd) { // return 0 if error // return 0 if this is not an appimgage2 file -long unsigned int appimage2_size(const char *fname) { +long unsigned int appimage2_size(int fd) { ssize_t ret; - int fd; long unsigned int size = 0; - fd = open(fname, O_RDONLY); if (fd < 0) return 0; ret = pread(fd, ehdr.e_ident, EI_NIDENT, 0); if (ret != EI_NIDENT) - goto getout; + return 0; if ((ehdr.e_ident[EI_DATA] != ELFDATA2LSB) && (ehdr.e_ident[EI_DATA] != ELFDATA2MSB)) - goto getout; + return 0; if(ehdr.e_ident[EI_CLASS] == ELFCLASS32) { size = read_elf32(fd); @@ -156,23 +154,19 @@ long unsigned int appimage2_size(const char *fname) { size = read_elf64(fd); } else { - goto getout; + return 0; } if (size == 0) - goto getout; + return 0; // look for a LZMA header at this location unsigned char buf[4]; ret = pread(fd, buf, 4, size); - if (ret != 4) { - size = 0; - goto getout; - } + if (ret != 4) + return 0; if (memcmp(buf, "hsqs", 4) != 0) - size = 0; + return 0; -getout: - close(fd); return size; } diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h index 3b9a00c3f..ca4c988fa 100644 --- a/src/firejail/firejail.h +++ b/src/firejail/firejail.h @@ -802,7 +802,7 @@ void appimage_mount(void); void appimage_clear(void); // appimage_size.c -long unsigned int appimage2_size(const char *fname); +long unsigned int appimage2_size(int fd); // cmdline.c void build_cmdline(char **command_line, char **window_title, int argc, char **argv, int index); -- cgit v1.2.3-70-g09d2