Skip to content

Commit

Permalink
udf_get_extendedattr() had no boundary checks.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mywave82 authored and jankara committed Aug 23, 2021
1 parent 28ce50f commit 58bc6d1
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions fs/udf/misc.c
Original file line number Diff line number Diff line change
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 58bc6d1

Please sign in to comment.