Re: [PATCH] [RFC] [resend] isofs: work-around for RockRidge+Joliet CDs with empty ISO root directory

From: Guenter Roeck
Date: Tue Aug 31 2010 - 16:45:27 EST


On Tue, 2010-08-31 at 14:10 -0400, Ondrej Zary wrote:
> If a CD has both Rock Ridge and Joliet extensions and the ISO root directory
> is empty, no files are visible. Disable Rock Ridge extensions in this case and
> use Joliet root directory instead.
>
> Signed-off-by: Ondrej Zary <linux@xxxxxxxxxxxxxxxxxxxx>
>
> --- linux-2.6.35-rc2/fs/isofs/inode.c 2010-06-06 05:43:24.000000000 +0200
> +++ linux-2.6.35-rc3/fs/isofs/inode.c 2010-08-24 22:43:26.000000000 +0200
> @@ -549,6 +549,34 @@ static unsigned int isofs_get_last_sessi
> }
>
> /*
> + * Check if root directory is empty (has less than 3 files).
> + *
> + * Used to detect broken CDs where ISO root directory is empty but Joliet root
> + * directory is OK. If such CD has Rock Ridge extensions, they will be disabled
> + * (and Joliet used instead) or else no files would be visible.
> + */
> +static bool rootdir_empty(struct super_block *sb, unsigned long block)
> +{
> + int offset, files, de_len;
> + struct iso_directory_record *de;
> + struct buffer_head *bh;
> +
> + bh = sb_bread(sb, block);
> + if (!bh)
> + return true;
> + while (files < 3) {

files is uninitialized.

> + de = (struct iso_directory_record *) (bh->b_data + offset);

offset is uninitialized.

Did you test this patch ?

> + de_len = *(unsigned char *) de;
> + if (de_len == 0)
> + break;
> + files++;
> + offset += de_len;
> + }
> + brelse(bh);
> + return files < 3;
> +}
> +
> +/*
> * Initialize the superblock and read the root inode.
> *
> * Note: a check_disk_change() has been done immediately prior
> @@ -842,6 +870,18 @@ root_found:
> goto out_no_root;
>
> /*
> + * Fix for broken CDs with Rock Ridge and empty ISO root directory but
> + * correct Joliet root directory.
> + */
> + if (sbi->s_rock == 1 && joliet_level &&
> + rootdir_empty(s, sbi->s_firstdatazone)) {
> + printk(KERN_NOTICE
> + "ISOFS: primary root directory is empty. "
> + "Disabling Rock Ridge and switching to Joliet.");
> + sbi->s_rock = 0;
> + }
> +
> + /*
> * If this disk has both Rock Ridge and Joliet on it, then we
> * want to use Rock Ridge by default. This can be overridden
> * by using the norock mount option. There is still one other
>
>
>


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/