]> git.ipfire.org Git - pakfire.git/commitdiff
build: Move strip check into file check
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 17 Mar 2023 13:56:40 +0000 (13:56 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 17 Mar 2023 13:56:40 +0000 (13:56 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/file.c
src/libpakfire/include/pakfire/file.h

index 5ea9e76504a36f8270eab602a1a4163f70402cde..4234be712ac2457cfc6ad23ea12b44d28bc62a67 100644 (file)
@@ -1109,35 +1109,6 @@ static int pakfire_build_post_remove_static_libraries(
                PAKFIRE_BUILD_CLEANUP_FILES);
 }
 
-static int __pakfire_build_post_check_stripped(
-               struct pakfire* pakfire, struct pakfire_file* file, void* data) {
-       struct pakfire_filelist* filelist = (struct pakfire_filelist*)data;
-       int r;
-
-       // Skip anything that isn't an ELF file
-       if (!pakfire_file_matches_class(file, PAKFIRE_FILE_ELF))
-               return 0;
-
-       // Collect all stripped files
-       if (pakfire_file_is_stripped(file)) {
-               r = pakfire_filelist_add(filelist, file);
-               if (r) {
-                       ERROR(pakfire, "Could not add file to filelist: %m\n");
-                       return r;
-               }
-       }
-
-       return 0;
-}
-
-static int pakfire_build_post_check_stripped(
-               struct pakfire_build* build, struct pakfire_filelist* filelist) {
-       return pakfire_build_post_process_files(build, filelist,
-               "Files lacking debugging information:",
-               __pakfire_build_post_check_stripped,
-               PAKFIRE_BUILD_ERROR_IF_NOT_EMPTY);
-}
-
 static int __pakfire_build_remove_libtool_archives(
                struct pakfire* pakfire, struct pakfire_file* file, void* data) {
        struct pakfire_filelist* removees = (struct pakfire_filelist*)data;
@@ -1276,11 +1247,6 @@ static int pakfire_build_run_post_build_checks(struct pakfire_build* build) {
                goto ERROR;
        }
 
-       // Check if binaries have been stripped
-       r = pakfire_build_post_check_stripped(build, filelist);
-       if (r)
-               goto ERROR;
-
        // Remove any static libraries
        r = pakfire_build_post_remove_static_libraries(build, filelist);
        if (r)
index b4b599a7bd19d98a842d4f65c87142b666702846..24a76553e6b3339b70aa42cba56d7f4802ddda3e 100644 (file)
@@ -623,6 +623,12 @@ char* pakfire_file_dump(struct pakfire_file* file, int flags) {
                                goto ERROR;
                }
 
+               if (file->issues & PAKFIRE_FILE_MISSING_DEBUGINFO) {
+                       r = asprintf(&buffer, "%s [MISSING-DEBUGINFO]", buffer);
+                       if (r < 0)
+                               goto ERROR;
+               }
+
                if (pakfire_file_matches_class(file, PAKFIRE_FILE_ELF)) {
                        // Stack-smashing Protection
                        if (file->issues & PAKFIRE_FILE_NO_SSP) {
@@ -1692,7 +1698,7 @@ static int pakfire_file_get_elf_type(struct pakfire_file* file) {
        return type;
 }
 
-static int __pakfire_file_is_stripped(struct pakfire_file* file, Elf* elf, void* data) {
+static int __pakfire_file_check_debuginfo(struct pakfire_file* file, Elf* elf, void* data) {
        Elf_Scn* section = NULL;
        GElf_Shdr shdr;
 
@@ -1715,20 +1721,13 @@ static int __pakfire_file_is_stripped(struct pakfire_file* file, Elf* elf, void*
        // Not found
        DEBUG(file->pakfire, "%s has no debug sections\n", file->path);
 
-       return 1;
-}
+       // Store the result
+       file->issues |= PAKFIRE_FILE_MISSING_DEBUGINFO;
 
-int pakfire_file_is_stripped(struct pakfire_file* file) {
-       // Don't run this for non-ELF files
-       if (!pakfire_file_matches_class(file, PAKFIRE_FILE_ELF)) {
-               errno = EINVAL;
-               return -1;
-       }
-
-       // Do not perform this check on firmware
-       if (pakfire_file_matches_class(file, PAKFIRE_FILE_FIRMWARE))
-               return 0;
+       return 0;
+}
 
+static int pakfire_file_check_debuginfo(struct pakfire_file* file) {
        switch (pakfire_file_get_elf_type(file)) {
                // Do not check Relocatable Objects
                case ET_REL:
@@ -1739,7 +1738,7 @@ int pakfire_file_is_stripped(struct pakfire_file* file) {
                        break;
        }
 
-       return pakfire_file_open_elf(file, __pakfire_file_is_stripped, NULL);
+       return pakfire_file_open_elf(file, __pakfire_file_check_debuginfo, NULL);
 }
 
 static int __pakfire_file_check_ssp(
@@ -1811,6 +1810,10 @@ static int pakfire_file_check_ssp(struct pakfire_file* file) {
        if (pakfire_file_matches_class(file, PAKFIRE_FILE_RUNTIME_LINKER))
                return 0;
 
+       // We cannot perform this check if we don't have debuginfo
+       if (file->issues & PAKFIRE_FILE_MISSING_DEBUGINFO)
+               return 0;
+
        return pakfire_file_open_elf(file, __pakfire_file_check_ssp, NULL);
 }
 
@@ -1948,6 +1951,11 @@ int pakfire_file_check(struct pakfire_file* file, int* issues) {
                                        break;
                        }
 
+                       // Check if the file has debug info
+                       r = pakfire_file_check_debuginfo(file);
+                       if (r)
+                               return r;
+
                        // Check for SSP
                        r = pakfire_file_check_ssp(file);
                        if (r)
index 253619101ef0ec94ceac04acc4c351af5ac0ad3b..d6f4e55888960730fd4fff0d56938d5738d32b42 100644 (file)
@@ -177,13 +177,13 @@ int pakfire_file_verify(struct pakfire_file* file, int* status);
 */
 enum pakfire_file_check_issues {
        PAKFIRE_FILE_FHS_ERROR          = (1 << 0),
-       PAKFIRE_FILE_NO_SSP             = (1 << 1),
-       PAKFIRE_FILE_NO_PIE             = (1 << 2),
-       PAKFIRE_FILE_EXECSTACK          = (1 << 3),
-       PAKFIRE_FILE_NO_PARTIALLY_RELRO = (1 << 4),
+       PAKFIRE_FILE_MISSING_DEBUGINFO  = (1 << 1),
+       PAKFIRE_FILE_NO_SSP             = (1 << 2),
+       PAKFIRE_FILE_NO_PIE             = (1 << 3),
+       PAKFIRE_FILE_EXECSTACK          = (1 << 4),
+       PAKFIRE_FILE_NO_PARTIALLY_RELRO = (1 << 5),
 };
 
-int pakfire_file_is_stripped(struct pakfire_file* file);
 int pakfire_file_check(struct pakfire_file* file, int* issues);
 
 #endif