From cfce456a5c21f0d1f0d468966e24a0cc8614e094 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 5 Oct 2025 16:31:21 +0100 Subject: [PATCH] Add sorting function for DumpExtent arrays and implement sorting in dump processing --- include/internal.h | 1 + src/blocks/dump.c | 9 ++++++++- src/dump.c | 9 ++++++++- src/helpers.c | 23 +++++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/internal.h b/include/internal.h index b10becc..ecdf4ac 100644 --- a/include/internal.h +++ b/include/internal.h @@ -55,5 +55,6 @@ bool set_ddt_multi_level_v2(aaruformatContext *ctx, uint64_t sector_address aaru_options parse_options(const char *options); uint64_t get_filetime_uint64(); int32_t aaruf_close_current_block(aaruformatContext *ctx); +int compare_extents(const void *a, const void *b); #endif // LIBAARUFORMAT_INTERNAL_H diff --git a/src/blocks/dump.c b/src/blocks/dump.c index 248f7eb..7408cce 100644 --- a/src/blocks/dump.c +++ b/src/blocks/dump.c @@ -22,6 +22,7 @@ #include #include "aaruformat.h" +#include "internal.h" #include "log.h" /** @@ -329,7 +330,13 @@ void process_dumphw_block(aaruformatContext *ctx, const IndexEntry *entry) continue; } - // TODO: qsort() + // Sort extents by start sector for efficient lookup and validation + if(ctx->dumpHardwareEntriesWithData[e].entry.extents > 0 && ctx->dumpHardwareEntriesWithData[e].extents != NULL) + { + qsort(ctx->dumpHardwareEntriesWithData[e].extents, ctx->dumpHardwareEntriesWithData[e].entry.extents, + sizeof(DumpExtent), compare_extents); + TRACE("Sorted %u extents for entry %u", ctx->dumpHardwareEntriesWithData[e].entry.extents, e); + } } TRACE("Exiting process_dumphw_block()"); } \ No newline at end of file diff --git a/src/dump.c b/src/dump.c index 58092cd..e64ca76 100644 --- a/src/dump.c +++ b/src/dump.c @@ -17,8 +17,10 @@ */ #include +#include #include "aaruformat.h" +#include "internal.h" #include "log.h" /** @@ -675,7 +677,12 @@ int32_t aaruf_set_dumphw(void *context, uint8_t *data, size_t length) memcpy(copy[e].extents, data + pos, sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents); pos += sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents; - // TODO: qsort() + // Sort extents by start sector for efficient lookup and validation + if(copy[e].entry.extents > 0 && copy[e].extents != NULL) + { + qsort(copy[e].extents, copy[e].entry.extents, sizeof(DumpExtent), compare_extents); + TRACE("Sorted %u extents for entry %d", copy[e].entry.extents, e); + } } // Free old data diff --git a/src/helpers.c b/src/helpers.c index 96b30f0..efce319 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -436,3 +436,26 @@ int32_t aaruf_get_xml_mediatype(const int32_t type) return BlockMedia; } } + +/** + * @brief Comparison function for sorting DumpExtent arrays by start sector. + * + * This function is used by qsort() to order dump extents in ascending order based on their + * start sector values. Extents with lower start sectors will appear first in the sorted array. + * This ordering is important for efficient extent lookup and validation during image operations. + * + * @param a Pointer to the first DumpExtent to compare. + * @param b Pointer to the second DumpExtent to compare. + * @return Negative value if a->start < b->start, zero if equal, positive if a->start > b->start. + */ +int compare_extents(const void *a, const void *b) +{ + const DumpExtent *extent_a = a; + const DumpExtent *extent_b = b; + + if(extent_a->start < extent_b->start) + return -1; + if(extent_a->start > extent_b->start) + return 1; + return 0; +}