From a1e75003b56168432ac604d069968083639ef6e5 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 15 Jan 2019 16:26:56 +0100 Subject: [PATCH] Bug fix: Appending partitions 5 to 8 caused damaged ISO filesystems if not for SUN disk label --- libisofs/ecma119.c | 22 +++++++++++++++++----- libisofs/ecma119.h | 8 +++++++- libisofs/system_area.c | 29 ++++++++++++++++------------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index 84303ad..3b904e0 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -4601,13 +4601,13 @@ ex: /* LIBISO_ALLOC_MEM failed */ } -/* Obtains start and end number of appended partition range and returns - the number of valid entries in the list of appended partitions. +/* Determines the range of valid partition numbers depending on partition + table type. */ -int iso_count_appended_partitions(Ecma119Image *target, - int *first_partition, int *last_partition) +void iso_tell_max_part_range(Ecma119Image *target, + int *first_partition, int *last_partition) { - int sa_type, i, count= 0; + int sa_type; sa_type = (target->system_area_options >> 2) & 0x3f; if (sa_type == 3) { /* SUN Disk Label */ @@ -4617,6 +4617,18 @@ int iso_count_appended_partitions(Ecma119Image *target, *first_partition = 1; *last_partition = 4; } +} + + +/* Obtains start and end number of appended partition range and returns + the number of valid entries in the list of appended partitions. +*/ +int iso_count_appended_partitions(Ecma119Image *target, + int *first_partition, int *last_partition) +{ + int i, count= 0; + + iso_tell_max_part_range(target, first_partition, last_partition); for (i = *first_partition - 1; i <= *last_partition - 1; i++) { if (target->opts->appended_partitions[i] == NULL) continue; diff --git a/libisofs/ecma119.h b/libisofs/ecma119.h index 0b8f63e..cebe83a 100644 --- a/libisofs/ecma119.h +++ b/libisofs/ecma119.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2007 Vreixo Formoso - * Copyright (c) 2009 - 2018 Thomas Schmitt + * Copyright (c) 2009 - 2019 Thomas Schmitt * * This file is part of the libisofs project; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 @@ -1055,4 +1055,10 @@ int iso_interval_reader_start_size(Ecma119Image *t, char *path, int iso_count_appended_partitions(Ecma119Image *target, int *first_partition, int *last_partition); +/* Determines the range of valid partition numbers depending on partition + table type. +*/ +void iso_tell_max_part_range(Ecma119Image *target, + int *first_partition, int *last_partition); + #endif /*LIBISO_ECMA119_H_*/ diff --git a/libisofs/system_area.c b/libisofs/system_area.c index 7d83c64..f20ea0f 100644 --- a/libisofs/system_area.c +++ b/libisofs/system_area.c @@ -153,8 +153,10 @@ static int compute_partition_size(Ecma119Image *t, char *disk_path, int iso_compute_append_partitions(Ecma119Image *t, int flag) { int ret, i, sa_type, cyl_align, cyl_size = 0; + int first_partition, last_partition; uint32_t pos, size, add_pos = 0; off_t start_byte, byte_count; + char msg[80]; sa_type = (t->system_area_options >> 2) & 0x3f; cyl_align = (t->system_area_options >> 8) & 0x3; @@ -176,11 +178,20 @@ int iso_compute_append_partitions(Ecma119Image *t, int flag) #endif + iso_tell_max_part_range(t, &first_partition, &last_partition); for (i = 0; i < ISO_MAX_PARTITIONS; i++) { if (t->opts->appended_partitions[i] == NULL) continue; if (t->opts->appended_partitions[i][0] == 0) continue; + if (i + 1 > last_partition || i + 1 < first_partition) { + sprintf(msg, + "Partition number %d of appended partition is out of range [%d - %d]", + i + 1, first_partition, last_partition); + iso_msgs_submit(0, msg, 0, "FAILURE", 0); + return ISO_BAD_PARTITION_NO; + } + ret = compute_partition_size(t, t->opts->appended_partitions[i], &size, t->opts->appended_part_flags[i]); if (ret < 0) @@ -1862,10 +1873,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf) memset(buf, 0, 16 * BLOCK_SIZE); sa_type = (t->system_area_options >> 2) & 0x3f; - if (sa_type == 3) { - first_partition = 2; - last_partition = 8; - } + + iso_tell_max_part_range(t, &first_partition, &last_partition); for (i = first_partition - 1; i <= last_partition - 1; i++) if (t->opts->appended_partitions[i] != NULL) { will_append = 1; @@ -3190,20 +3199,14 @@ static int partappend_writer_write_vol_desc(IsoImageWriter *writer) static int partappend_writer_write_data(IsoImageWriter *writer) { Ecma119Image *target; - int res, first_partition = 1, last_partition = 0, sa_type; + int res, first_partition = 1, last_partition = 0; int i; target = writer->target; /* Append partition data */ - sa_type = (target->system_area_options >> 2) & 0x3f; - if (sa_type == 0) { /* MBR */ - first_partition = 1; - last_partition = 4; - } else if (sa_type == 3) { /* SUN Disk Label */ - first_partition = 2; - last_partition = 8; - } + iso_tell_max_part_range(target, &first_partition, &last_partition); + for (i = first_partition - 1; i <= last_partition - 1; i++) { if (target->opts->appended_partitions[i] == NULL) continue;