]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: do not check symlink component lengths
authorEric Sandeen <sandeen@sandeen.net>
Thu, 5 Feb 2015 23:24:36 +0000 (10:24 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 5 Feb 2015 23:24:36 +0000 (10:24 +1100)
As reported by Andy Grimm,

# ln -s $( python -c 'print "a" * 260' ) /mnt/foo

will succeed on xfs, but then xfs_repair will complain:

component of symlink in inode 131 too long
problem with symbolic link in inode 131
would have cleared inode 131

The kernel checks the total length of the symlink on both read
and write, but does not look at component paths.

Looking around the kernel, no other filesystem checks component
lengths, nor does the vfs.  And as Andy points out, the target
could even be on a different filesystem, with different limitations.

And having a "too-long" component doesn't even seem like something
likely to stem from disk corruption anyway, so I'm not sure why repair
should care.

Therefore I propose removing the component length checks from xfs_repair.

Andy Grimm <agrimm@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
repair/dinode.c

index 38a65623486b3ade3c7f88f8a0021c187b9b32c6..73e4b9eb3bb352f440f99dd410f0e6330ec153dc 100644 (file)
@@ -1333,7 +1333,7 @@ process_symlink(
        xfs_dinode_t    *dino,
        blkmap_t        *blkmap)
 {
-       char                    *symlink, *cptr;
+       char                    *symlink;
        char                    data[MAXPATHLEN];
 
        /*
@@ -1380,31 +1380,6 @@ _("found illegal null character in symlink inode %" PRIu64 "\n"),
                return(1);
        }
 
-       /*
-        * check for any component being too long
-        */
-       if (be64_to_cpu(dino->di_size) >= MAXNAMELEN)  {
-               cptr = strchr(symlink, '/');
-
-               while (cptr != NULL)  {
-                       if (cptr - symlink >= MAXNAMELEN)  {
-                               do_warn(
-_("component of symlink in inode %" PRIu64 " too long\n"),
-                                       lino);
-                               return(1);
-                       }
-                       symlink = cptr + 1;
-                       cptr = strchr(symlink, '/');
-               }
-
-               if (strlen(symlink) >= MAXNAMELEN)  {
-                       do_warn(
-_("component of symlink in inode %" PRIu64 " too long\n"),
-                               lino);
-                       return(1);
-               }
-       }
-
        return(0);
 }