mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 12:21:37 +00:00
udf: Check component length before reading it
Check that length specified in a component of a symlink fits in the input buffer we are reading. Also properly ignore component length for component types that do not use it. Otherwise we read memory after end of buffer for corrupted udf image. Reported-by: Carl Henrik Lunde <chlunde@ping.uio.no> CC: stable@vger.kernel.org Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
0e5cc9a40a
commit
e237ec37ec
@ -42,14 +42,17 @@ static int udf_pc_to_char(struct super_block *sb, unsigned char *from,
|
||||
tolen--;
|
||||
while (elen < fromlen) {
|
||||
pc = (struct pathComponent *)(from + elen);
|
||||
elen += sizeof(struct pathComponent);
|
||||
switch (pc->componentType) {
|
||||
case 1:
|
||||
/*
|
||||
* Symlink points to some place which should be agreed
|
||||
* upon between originator and receiver of the media. Ignore.
|
||||
*/
|
||||
if (pc->lengthComponentIdent > 0)
|
||||
if (pc->lengthComponentIdent > 0) {
|
||||
elen += pc->lengthComponentIdent;
|
||||
break;
|
||||
}
|
||||
/* Fall through */
|
||||
case 2:
|
||||
if (tolen == 0)
|
||||
@ -74,6 +77,9 @@ static int udf_pc_to_char(struct super_block *sb, unsigned char *from,
|
||||
/* that would be . - just ignore */
|
||||
break;
|
||||
case 5:
|
||||
elen += pc->lengthComponentIdent;
|
||||
if (elen > fromlen)
|
||||
return -EIO;
|
||||
comp_len = udf_get_filename(sb, pc->componentIdent,
|
||||
pc->lengthComponentIdent,
|
||||
p, tolen);
|
||||
@ -85,7 +91,6 @@ static int udf_pc_to_char(struct super_block *sb, unsigned char *from,
|
||||
tolen--;
|
||||
break;
|
||||
}
|
||||
elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
|
||||
}
|
||||
if (p > to + 1)
|
||||
p[-1] = '\0';
|
||||
|
Loading…
Reference in New Issue
Block a user