Bug fix ticket 144: File size damage by non-unique inode numbers of
pre-RRIP 1.12 images Replaced the extent-LBA based inode number by a static 32 bit counter. I deem it safe because if the numbers repeat within a single image reading, then we are doomed anyway. I banned inode number 0 just in case it has a meaning. TODO: what if ER says IEEE_1282 but the PX field has only 36 bytes ?
This commit is contained in:
parent
0026c93cd4
commit
28e8936b4f
@ -1206,7 +1206,10 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
"Sparse files not supported.");
|
"Sparse files not supported.");
|
||||||
break;
|
break;
|
||||||
} else if (SUSP_SIG(sue, 'R', 'R')) {
|
} else if (SUSP_SIG(sue, 'R', 'R')) {
|
||||||
/* TODO I've seen this RR on mkisofs images. what's this? */
|
/* This was an optional flag byte in RRIP 1.09 which told the
|
||||||
|
reader what other RRIP fields to expect.
|
||||||
|
mkisofs emits it. We don't.
|
||||||
|
*/
|
||||||
continue;
|
continue;
|
||||||
} else if (SUSP_SIG(sue, 'S', 'P')) {
|
} else if (SUSP_SIG(sue, 'S', 'P')) {
|
||||||
/*
|
/*
|
||||||
@ -1385,13 +1388,41 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ts Nov 25 2008: TODO
|
||||||
|
This seems not fully consistent with read_rr_PX() which decides
|
||||||
|
by (px->len_sue[0] == 44) whether an inode number is present or not.
|
||||||
|
What if read_rr_PX finds a PX of length 36 in a IEEE_1282 image ?
|
||||||
|
It is illegal but could confuse the image by duplicate inode numbers.
|
||||||
|
|
||||||
|
Regrettably it is not enough to just use single default numbers.
|
||||||
|
If only one number misses in the image, then all would need to be
|
||||||
|
defaulted by the following iso_global_inode code.
|
||||||
|
|
||||||
|
Why do duplicate inode numbers confuse the file lengths, anyway ?
|
||||||
|
(See ticket 144)
|
||||||
|
*/
|
||||||
if (fsdata->rr != RR_EXT_112) {
|
if (fsdata->rr != RR_EXT_112) {
|
||||||
/*
|
/*
|
||||||
* Only RRIP 1.12 provides valid inode numbers. If not, it is not easy
|
* Only RRIP 1.12 provides valid inode numbers. If not, it is not easy
|
||||||
* to generate those serial numbers, and we use extend block instead.
|
* to generate those serial numbers, and we use extend block instead.
|
||||||
* It BREAKS POSIX SEMANTICS, but its suitable for our needs
|
* It BREAKS POSIX SEMANTICS, but its suitable for our needs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define Libisofs_patch_ticket_144 yes
|
||||||
|
#ifdef Libisofs_patch_ticket_144
|
||||||
|
/* Trying to ensure unique inode numbers */
|
||||||
|
{
|
||||||
|
static ino_t iso_global_inode= 0;
|
||||||
|
|
||||||
|
if(iso_global_inode <= 0)
|
||||||
|
iso_global_inode= 1;
|
||||||
|
atts.st_ino = iso_global_inode++;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Ticket 144: This produces duplicate numbers with empty files.
|
||||||
|
*/
|
||||||
atts.st_ino = (ino_t) iso_read_bb(record->block, 4, NULL);
|
atts.st_ino = (ino_t) iso_read_bb(record->block, 4, NULL);
|
||||||
|
#endif
|
||||||
if (fsdata->rr == 0) {
|
if (fsdata->rr == 0) {
|
||||||
atts.st_nlink = 1;
|
atts.st_nlink = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user