Fix important bug. File sections must be computed before dir size.
This commit is contained in:
parent
ff480b35e9
commit
fb3c3e1a6d
@ -68,13 +68,30 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
|
|
||||||
/* fill key and other atts */
|
/* fill key and other atts */
|
||||||
fsrc->prev_img = file->from_old_session;
|
fsrc->prev_img = file->from_old_session;
|
||||||
if (file->from_old_session) {
|
if (file->from_old_session && img->appendable) {
|
||||||
|
/*
|
||||||
|
* On multisession discs we keep file sections from old image.
|
||||||
|
*/
|
||||||
int ret = iso_file_get_old_image_sections(file, &(fsrc->nsections),
|
int ret = iso_file_get_old_image_sections(file, &(fsrc->nsections),
|
||||||
&(fsrc->sections), 0);
|
&(fsrc->sections), 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(fsrc);
|
free(fsrc);
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For new files, or for image copy, we compute our own file sections.
|
||||||
|
* Block and size of each section will be filled later.
|
||||||
|
*/
|
||||||
|
off_t section_size = iso_stream_get_size(file->stream);
|
||||||
|
if (section_size > (off_t) MAX_ISO_FILE_SECTION_SIZE) {
|
||||||
|
fsrc->nsections = DIV_UP(section_size - (off_t) MAX_ISO_FILE_SECTION_SIZE,
|
||||||
|
(off_t)ISO_EXTENT_SIZE) + 1;
|
||||||
|
} else {
|
||||||
|
fsrc->nsections = 1;
|
||||||
|
}
|
||||||
|
fsrc->sections = calloc(fsrc->nsections, sizeof(struct iso_file_section));
|
||||||
}
|
}
|
||||||
fsrc->sort_weight = file->sort_weight;
|
fsrc->sort_weight = file->sort_weight;
|
||||||
fsrc->stream = file->stream;
|
fsrc->stream = file->stream;
|
||||||
@ -187,15 +204,6 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
IsoFileSrc *file = filelist[i];
|
IsoFileSrc *file = filelist[i];
|
||||||
|
|
||||||
off_t section_size = iso_stream_get_size(file->stream);
|
off_t section_size = iso_stream_get_size(file->stream);
|
||||||
if (section_size > (off_t) MAX_ISO_FILE_SECTION_SIZE) {
|
|
||||||
file->nsections = DIV_UP(iso_stream_get_size(file->stream)
|
|
||||||
- (off_t) MAX_ISO_FILE_SECTION_SIZE,
|
|
||||||
(off_t)ISO_EXTENT_SIZE) + 1;
|
|
||||||
} else {
|
|
||||||
file->nsections = 1;
|
|
||||||
}
|
|
||||||
file->sections = realloc(file->sections, file->nsections *
|
|
||||||
sizeof(struct iso_file_section));
|
|
||||||
for (extent = 0; extent < file->nsections - 1; ++extent) {
|
for (extent = 0; extent < file->nsections - 1; ++extent) {
|
||||||
file->sections[extent].block = t->curblock + extent *
|
file->sections[extent].block = t->curblock + extent *
|
||||||
(ISO_EXTENT_SIZE / BLOCK_SIZE);
|
(ISO_EXTENT_SIZE / BLOCK_SIZE);
|
||||||
@ -207,8 +215,7 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
* final section
|
* final section
|
||||||
*/
|
*/
|
||||||
file->sections[extent].block = t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE);
|
file->sections[extent].block = t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE);
|
||||||
file->sections[extent].size = section_size;
|
file->sections[extent].size = (uint32_t)section_size;
|
||||||
section_size -= (off_t) ISO_EXTENT_SIZE;
|
|
||||||
|
|
||||||
t->curblock += DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE);
|
t->curblock += DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ static void test_rrip_calc_len_file()
|
|||||||
|
|
||||||
file = malloc(sizeof(IsoFile));
|
file = malloc(sizeof(IsoFile));
|
||||||
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
||||||
file->msblock = 0;
|
file->from_old_session = 0;
|
||||||
file->sort_weight = 0;
|
file->sort_weight = 0;
|
||||||
file->stream = NULL; /* it is not needed here */
|
file->stream = NULL; /* it is not needed here */
|
||||||
file->node.type = LIBISO_FILE;
|
file->node.type = LIBISO_FILE;
|
||||||
@ -303,7 +303,7 @@ void test_rrip_get_susp_fields_file()
|
|||||||
|
|
||||||
file = malloc(sizeof(IsoFile));
|
file = malloc(sizeof(IsoFile));
|
||||||
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
||||||
file->msblock = 0;
|
file->from_old_session = 0;
|
||||||
file->sort_weight = 0;
|
file->sort_weight = 0;
|
||||||
file->stream = NULL; /* it is not needed here */
|
file->stream = NULL; /* it is not needed here */
|
||||||
file->node.type = LIBISO_FILE;
|
file->node.type = LIBISO_FILE;
|
||||||
|
Loading…
Reference in New Issue
Block a user