Bug fix: Appending partitions 5 to 8 caused damaged ISO filesystems if not for SUN disk label
This commit is contained in:
parent
4064a7e0ee
commit
a1e75003b5
@ -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;
|
||||
|
@ -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_*/
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user