hfsplus corrupts filesystems >2TB

From: Ben Hutchings
Date: Tue Oct 06 2009 - 22:52:39 EST


A Debian bug report <http://bugs.debian.org/550010> alerted me to the
fact that hfsplus is not using enough bits for some sector calculations.

hfsplus_get_block() does:

u32 ablock, dblock, mask;
...
map_bh(bh_result, sb, (dblock << HFSPLUS_SB(sb).fs_shift) + HFSPLUS_SB(sb).blockoffset + (iblock & mask));

which results in overflow when the sector number is >2^32. Now it might
be sufficient to change the last line to:

map_bh(bh_result, sb, ((sector_t)dblock << HFSPLUS_SB(sb).fs_shift) + HFSPLUS_SB(sb).blockoffset + (iblock & mask));

but there may be many other places where u32 must be changed to
sector_t.

For Debian's stable release, I'm intending to prevent mounting volumes
larger than 2^32 sectors (2TB). Is anyone interested in fixing this
properly or should I submit the same change for mainline?

Ben.

--
Ben Hutchings
To err is human; to really foul things up requires a computer.

Attachment: signature.asc
Description: This is a digitally signed message part