Skip to content

Commit

Permalink
udf_get_extendedattr() had no boundary checks.
Browse files Browse the repository at this point in the history
[ Upstream commit 58bc6d1 ]

When parsing the ExtendedAttr data, malicous or corrupt attribute length
could cause kernel hangs and buffer overruns in some special cases.

Link: https://lore.kernel.org/r/20210822093332.25234-1-stian.skjelstad@gmail.com
Signed-off-by: Stian Skjelstad <stian.skjelstad@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
mywave82 authored and gregkh committed Sep 15, 2021
1 parent db2f238 commit 9d99995
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions fs/udf/misc.c
Expand Up @@ -173,13 +173,22 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
else
offset = le32_to_cpu(eahd->appAttrLocation);

while (offset < iinfo->i_lenEAttr) {
while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) {
uint32_t attrLength;

gaf = (struct genericFormat *)&ea[offset];
attrLength = le32_to_cpu(gaf->attrLength);

/* Detect undersized elements and buffer overflows */
if ((attrLength < sizeof(*gaf)) ||
(attrLength > (iinfo->i_lenEAttr - offset)))
break;

if (le32_to_cpu(gaf->attrType) == type &&
gaf->attrSubtype == subtype)
return gaf;
else
offset += le32_to_cpu(gaf->attrLength);
offset += attrLength;
}
}

Expand Down

0 comments on commit 9d99995

Please sign in to comment.