Commit f93793fd authored by Russell King's avatar Russell King Committed by Al Viro
Browse files

fs/adfs: map: fix map scanning



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: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f6f14a0d
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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)