Re: [PATCH] isofs: handle CDs with bad root inode but good Joliet root directory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 8, 2024 at 3:59 AM Jan Kara <jack@xxxxxxx> wrote:
>
> On Wed 07-02-24 19:21:32, Alex Henrie wrote:
> > I have a CD copy of the original Tom Clancy's Ghost Recon game from
> > 2001. The disc mounts without error on Windows, but on Linux mounting
> > fails with the message "isofs_fill_super: get root inode failed". The
> > error originates in isofs_read_inode, which returns -EIO because de_len
> > is 0. The superblock on this disc appears to be intentionally corrupt as
> > a form of copy protection.
> >
> > When the root inode is unusable, instead of giving up immediately, try
> > to continue with the Joliet file table. This fixes the Ghost Recon CD
> > and probably other copy-protected CDs too.
> >
> > Signed-off-by: Alex Henrie <alexhenrie24@xxxxxxxxx>
>
> Thanks! I've added the patch to my tree. Just made two minor tweaks on
> commit:
>
> > @@ -908,8 +908,22 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
> >        * we then decide whether to use the Joliet descriptor.
> >        */
> >       inode = isofs_iget(s, sbi->s_firstdatazone, 0);
> > -     if (IS_ERR(inode))
> > -             goto out_no_root;
> > +
> > +     /*
> > +      * Fix for broken CDs with a corrupt root inode but a correct Joliet
> > +      * root directory.
> > +      */
> > +     if (IS_ERR(inode)) {
> > +             if (joliet_level) {
>
> Here I've added "&& sbi->s_firstdatazone != first_data_zone" to make sure
> joliet extension has a different inode. Not sure if such media would be
> valid but even if it was not, we should not crash the kernel (which would
> happen in that case because we don't expect inode to be NULL).
>
> > +                     printk(KERN_NOTICE
> > +                             "ISOFS: root inode is unusable. "
> > +                             "Disabling Rock Ridge and switching to Joliet.");
> > +                     sbi->s_rock = 0;
> > +                     inode = NULL;
> > +             } else {
> > +                     goto out_no_root;
> > +             }
> > +     }
> >
> >       /*
> >        * Fix for broken CDs with Rock Ridge and empty ISO root directory but
> > @@ -939,7 +953,8 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
> >                       sbi->s_firstdatazone = first_data_zone;
> >                       printk(KERN_DEBUG
> >                               "ISOFS: changing to secondary root\n");
> > -                     iput(inode);
> > +                     if (inode != NULL)
> > +                             iput(inode);
>
> This isn't needed. iput() handles NULL inode just fine.

I tried out your two changes and the patch still works great. Thank
you for noticing and fixing those details, and thanks for the quick
review!

-Alex





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux