Revert "libblkid: improve identification of ISO9660 partition"

This reverts commit fc84bc0a46.
This commit is contained in:
Karel Zak 2020-01-13 11:48:37 +01:00
parent b82237dfb2
commit cd361f901e
4 changed files with 12 additions and 91 deletions

View File

@ -19,9 +19,7 @@
#include <stdint.h>
#include <ctype.h>
#include "iso9660.h"
#include "superblocks.h"
#include "sysfs.h"
struct iso9660_date {
unsigned char year[4];
@ -45,13 +43,11 @@ struct iso_volume_descriptor {
unsigned char unused[8];
unsigned char space_size[8];
unsigned char escape_sequences[8];
unsigned char unused1[32];
unsigned char logical_block_size[4];
unsigned char unused2[186];
unsigned char unused1[222];
unsigned char publisher_id[128];
unsigned char unused3[128];
unsigned char unused2[128];
unsigned char application_id[128];
unsigned char unused4[111];
unsigned char unused3[111];
struct iso9660_date created;
struct iso9660_date modified;
} __attribute__((packed));
@ -173,22 +169,15 @@ static int is_str_empty(const unsigned char *str, size_t len)
/*
* The ISO format specifically avoids the first 32kb to allow for a
* partition table to be added, if desired.
* When an ISO contains a partition table, it is common to have a partition
* that points at the iso mani filesystem. In such case,
* When an ISO contains a partition table, the usual thing to do is to
* have a partition that points at the iso filesystem. In such case,
* we want to only probe the iso metadata for the corresponding partition
* device, avoiding returning the metadata for the parent block device.
*/
static bool isofs_belongs_to_device(blkid_probe pr, struct iso_volume_descriptor *iso)
static bool isofs_belongs_to_device(blkid_probe pr)
{
dev_t devno, disk_devno, isopart_devno;
dev_t devno;
blkid_partlist ls;
blkid_loff_t pr_offset;
int isopart_partno = -1;
int nparts, i;
int num_sectors, sector_size;
long iso_size;
blkid_partition par;
struct path_cxt *pc;
/* Get device number, but if that fails, assume we aren't dealing
* with partitions, and continue probing. */
@ -202,49 +191,10 @@ static bool isofs_belongs_to_device(blkid_probe pr, struct iso_volume_descriptor
if (!ls)
return true;
/* Calculate size of ISO9660 filesystem */
num_sectors = isonum_733(iso->space_size, false);
sector_size = isonum_723(iso->logical_block_size, false);
iso_size = ((long)num_sectors * (long)sector_size) >> 9;
/* Look for a partition that matches the ISO9660 filesystem start sector
* and size. */
pr_offset = blkid_probe_get_offset(pr);
nparts = blkid_partlist_numof_partitions(ls);
for (i = 0; i < nparts; i++) {
par = blkid_partlist_get_partition(ls, i);
if (blkid_partition_get_start(par) == pr_offset &&
blkid_partition_get_size(par) == iso_size) {
isopart_partno = blkid_partition_get_partno(par);
break;
}
}
/* If we didn't find a matching partition, consider the current
* device as an appropriate owner of the ISO9660 filesystem. */
if (isopart_partno == -1)
return true;
/* A partition matching the ISO9660 filesystem was found. Look for
* a devno that corresponds to this partition. */
disk_devno = blkid_probe_get_wholedisk_devno(pr);
pc = ul_new_sysfs_path(disk_devno, NULL, NULL);
if (!pc)
return true;
isopart_devno = sysfs_blkdev_partno_to_devno(pc, isopart_partno);
ul_unref_path(pc);
/* If no ISO9660 partition devno was found, consider the current device
* as an appropriate owner of the filesystem. This can happen for CD/DVDs,
* where partitions may exist in the table, but are not usually probed by
* the kernel. */
if (!isopart_devno)
return true;
/* We found a partition that matches the ISO9660 filesystem. Check that it
* corresponds to the device that we are probing. */
return devno == isopart_devno;
/* Check that the device we're working with corresponds to an
* entry in the partition table. If so, this is the correct
* device to return the iso metadata on. */
return blkid_partlist_devno_to_partition(ls, devno) != NULL;
}
/* iso9660 [+ Microsoft Joliet Extension] */
@ -264,7 +214,7 @@ static int probe_iso9660(blkid_probe pr, const struct blkid_idmag *mag)
/* Check if the iso metadata should be returned on a different device
* instead of this one. */
if (!isofs_belongs_to_device(pr, iso))
if (!isofs_belongs_to_device(pr))
return 1;
memcpy(label, iso->volume_id, sizeof(label));

View File

@ -1,10 +0,0 @@
ID_FS_BLOCK_SIZE=2048
ID_FS_UUID=2019-12-16-06-07-35-00
ID_FS_UUID_ENC=2019-12-16-06-07-35-00
ID_FS_BOOT_SYSTEM_ID=EL TORITO SPECIFICATION
ID_FS_LABEL=ISOIMAGE
ID_FS_LABEL_ENC=ISOIMAGE
ID_FS_TYPE=iso9660
ID_FS_USAGE=filesystem
ID_PART_TABLE_UUID=4b46ece2-6efb-4bf9-90a6-858c95e5581d
ID_PART_TABLE_TYPE=gpt

View File

@ -69,23 +69,4 @@ udevadm settle
$TS_CMD_BLKID -p -o udev ${TS_DEVICE} >> $TS_OUTPUT
ts_finalize_subtest
# This image (created by grub-mkrescue) has a partition table where the
# partitions do not point to the ISO9660 filesystem.
xz -dc ${TS_SELF}/iso-partitions-grub.img.xz > ${TS_DEVICE}
udevadm settle
ts_init_subtest "grub"
$TS_CMD_PARTX -a ${TS_DEVICE} &>/dev/null
udevadm settle
# Check that the ISO metadata is shown on the main disk device
$TS_CMD_BLKID -p -o udev ${TS_DEVICE} >> $TS_OUTPUT
# substitute major/minor number before comparison
sed -i \
-e 's/^\(ID_PART_ENTRY_DISK\)=.*/\1=__ts_majorminor__/' \
$TS_OUTPUT
ts_finalize_subtest
ts_finalize