OSDN Git Service

fs/adfs: super: limit idlen according to directory type
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 4 Jun 2019 13:50:19 +0000 (14:50 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 27 Jun 2019 00:14:14 +0000 (20:14 -0400)
Limit idlen according to the directory type, as idlen (the size of a
fragment ID) can not be more than 16 with the "new directory" layout.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/adfs/super.c

index b124343..d029ae1 100644 (file)
@@ -54,6 +54,7 @@ void adfs_msg(struct super_block *sb, const char *pfx, const char *fmt, ...)
 
 static int adfs_checkdiscrecord(struct adfs_discrecord *dr)
 {
+       unsigned int max_idlen;
        int i;
 
        /* sector size must be 256, 512 or 1024 bytes */
@@ -73,8 +74,13 @@ static int adfs_checkdiscrecord(struct adfs_discrecord *dr)
        if (le32_to_cpu(dr->disc_size_high) >> dr->log2secsize)
                return 1;
 
-       /* idlen must be no greater than 19 v2 [1.0] */
-       if (dr->idlen > 19)
+       /*
+        * Maximum idlen is limited to 16 bits for new directories by
+        * the three-byte storage of an indirect disc address.  For
+        * big directories, idlen must be no greater than 19 v2 [1.0]
+        */
+       max_idlen = dr->format_version ? 19 : 16;
+       if (dr->idlen > max_idlen)
                return 1;
 
        /* reserved bytes should be zero */