From: Russell King Date: Tue, 4 Jun 2019 13:50:19 +0000 (+0100) Subject: fs/adfs: super: limit idlen according to directory type X-Git-Tag: v5.3-rc1~30^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8616108de152447f99570dd45b6e3b8c71615fe5;p=thirdparty%2Fkernel%2Flinux.git fs/adfs: super: limit idlen according to directory type 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 Signed-off-by: Al Viro --- diff --git a/fs/adfs/super.c b/fs/adfs/super.c index b1243433add71..d029ae10f8a02 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c @@ -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 */