From: Michael Tremer Date: Sun, 5 Mar 2023 15:41:13 +0000 (+0000) Subject: file: Check if files are in ELF format X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=df71dc601fd6c7e75e859bb51176350ed9025df5;p=people%2Fstevee%2Fpakfire.git file: Check if files are in ELF format Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index b7396e3d..6d2a0b7b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -301,6 +301,7 @@ libpakfire_la_CFLAGS = \ -fvisibility=hidden \ $(CAP_LIBS) \ $(CURL_CFLAGS) \ + $(ELF_CFLAGS) \ $(JSON_C_CFLAGS) \ $(MAGIC_CFLAGS) \ $(MOUNT_CFLAGS) \ @@ -329,6 +330,7 @@ libpakfire_la_LIBADD = \ $(ARCHIVE_LIBS) \ $(CAP_LIBS) \ $(CURL_LIBS) \ + $(ELF_LIBS) \ $(GPGME_LIBS) \ $(JSON_C_LIBS) \ $(LZMA_LIBS) \ diff --git a/configure.ac b/configure.ac index cf84c5e3..91029206 100644 --- a/configure.ac +++ b/configure.ac @@ -255,6 +255,7 @@ AX_PYTHON_MODULE([tornado], [fatal]) PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.4.0]) PKG_CHECK_MODULES([CAP], [libcap]) PKG_CHECK_MODULES([CURL], [libcurl]) +PKG_CHECK_MODULES([ELF], [libelf]) PKG_CHECK_MODULES([GPGME], [gpgme >= 1.6.0]) PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}-embed], [], [PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])]) diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 1ea29042..d1cedb90 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -31,6 +31,8 @@ #include +#include + #include #include #include @@ -934,6 +936,17 @@ int pakfire_file_symlink_target_exists(struct pakfire_file* file) { Classification */ +static int setup_libelf(struct pakfire* pakfire) { + // Initialize libelf + if (elf_version(EV_CURRENT) == EV_NONE) { + ERROR(pakfire, "Could not initialize libelf: %s\n", elf_errmsg(-1)); + + return 1; + } + + return 0; +} + static int pakfire_file_classify_mode(struct pakfire_file* file) { // Check for regular files if (S_ISREG(file->st.st_mode)) @@ -1026,6 +1039,54 @@ static int pakfire_file_classify_magic(struct pakfire_file* file) { return 0; } +static int pakfire_file_classify_elf(struct pakfire_file* file) { + FILE* f = NULL; + Elf* elf = NULL; + int r; + + // Don't run this if we already know that file is an ELF file + if (file->class & PAKFIRE_FILE_ELF) + return 0; + + // Setup libelf + r = setup_libelf(file->pakfire); + if (r) + return r; + + // Open the file + f = fopen(file->abspath, "r"); + if (!f) { + ERROR(file->pakfire, "Could not open %s: %m\n", file->path); + return 1; + } + + // Try to open the ELF file + elf = elf_begin(fileno(f), ELF_C_READ, NULL); + if (!elf) { + // We fail silently here, because this file might be in a different format + goto ERROR; + } + + switch (elf_kind(elf)) { + // Mark this file as an ELF file + case ELF_K_ELF: + file->class |= PAKFIRE_FILE_ELF; + break; + + // Ignore everything else + default: + break; + } + +ERROR: + if (elf) + elf_end(elf); + if (f) + fclose(f); + + return 0; +} + int pakfire_file_classify(struct pakfire_file* file) { int r; @@ -1046,6 +1107,11 @@ int pakfire_file_classify(struct pakfire_file* file) { r = pakfire_file_classify_magic(file); if (r) goto ERROR; + + // Check if the file is an ELF file + r = pakfire_file_classify_elf(file); + if (r) + goto ERROR; } } diff --git a/src/libpakfire/include/pakfire/file.h b/src/libpakfire/include/pakfire/file.h index 18366180..dc26fa84 100644 --- a/src/libpakfire/include/pakfire/file.h +++ b/src/libpakfire/include/pakfire/file.h @@ -104,11 +104,12 @@ enum pakfire_file_classes { PAKFIRE_FILE_SOCKET = (1 << 6), // The rest - PAKFIRE_FILE_EXECUTABLE = (1 << 7), - PAKFIRE_FILE_PKGCONFIG = (1 << 8), - PAKFIRE_FILE_PERL = (1 << 9), - PAKFIRE_FILE_STATIC_LIBRARY = (1 << 10), - PAKFIRE_FILE_LIBTOOL_ARCHIVE = (1 << 11), + PAKFIRE_FILE_ELF = (1 << 7), + PAKFIRE_FILE_EXECUTABLE = (1 << 8), + PAKFIRE_FILE_PKGCONFIG = (1 << 9), + PAKFIRE_FILE_PERL = (1 << 10), + PAKFIRE_FILE_STATIC_LIBRARY = (1 << 11), + PAKFIRE_FILE_LIBTOOL_ARCHIVE = (1 << 12), }; int pakfire_file_create_from_path(struct pakfire_file** file,