]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/adfs: map: fix map scanning
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 9 Dec 2019 11:09:04 +0000 (11:09 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Jan 2020 01:12:40 +0000 (20:12 -0500)
When scanning the map for a fragment id, we need to keep track of the
free space links, so we don't inadvertently believe that the freespace
link is a valid fragment id.

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

index 82e1bf101fe68bb342384b72639edf423d9b661b..a81de80c45c1b09c85aa12a79c85f9e3e44d1e10 100644 (file)
@@ -72,9 +72,12 @@ static int lookup_zone(const struct adfs_discmap *dm, const unsigned int idlen,
        const u32 idmask = (1 << idlen) - 1;
        unsigned char *map = dm->dm_bh->b_data;
        unsigned int start = dm->dm_startbit;
-       unsigned int fragend;
+       unsigned int freelink, fragend;
        u32 frag;
 
+       frag = GET_FRAG_ID(map, 8, idmask & 0x7fff);
+       freelink = frag ? 8 + frag : 0;
+
        do {
                frag = GET_FRAG_ID(map, start, idmask);
 
@@ -82,7 +85,9 @@ static int lookup_zone(const struct adfs_discmap *dm, const unsigned int idlen,
                if (fragend >= endbit)
                        goto error;
 
-               if (frag == frag_id) {
+               if (start == freelink) {
+                       freelink += frag & 0x7fff;
+               } else if (frag == frag_id) {
                        unsigned int length = fragend + 1 - start;
 
                        if (*offset < length)