Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ufs: ufs_sb_private_info: remove unused s_{2,3}apb fields

These two fields are populated and stored as a "frequently used value"
in ufs_fill_super, but are not used afterwards in the driver.

Moreover, one of the shifts triggers UBSAN: shift-out-of-bounds when
apbshift is 12 because 12 * 3 = 36 and 1 << 36 does not fit in the 32
bit integer used to store the value.

Closes: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2087853
Signed-off-by: Agathe Porte <agathe.porte@canonical.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by

Agathe Porte and committed by
Al Viro
6cfe56fb b57c010e

-8
-4
fs/ufs/super.c
··· 1229 1229 else 1230 1230 uspi->s_apbshift = uspi->s_bshift - 2; 1231 1231 1232 - uspi->s_2apbshift = uspi->s_apbshift * 2; 1233 - uspi->s_3apbshift = uspi->s_apbshift * 3; 1234 1232 uspi->s_apb = 1 << uspi->s_apbshift; 1235 - uspi->s_2apb = 1 << uspi->s_2apbshift; 1236 - uspi->s_3apb = 1 << uspi->s_3apbshift; 1237 1233 uspi->s_apbmask = uspi->s_apb - 1; 1238 1234 uspi->s_nspfshift = uspi->s_fshift - UFS_SECTOR_BITS; 1239 1235 uspi->s_nspb = uspi->s_nspf << uspi->s_fpbshift;
-4
fs/ufs/ufs_fs.h
··· 775 775 776 776 __u32 s_fpbmask; /* fragments per block mask */ 777 777 __u32 s_apb; /* address per block */ 778 - __u32 s_2apb; /* address per block^2 */ 779 - __u32 s_3apb; /* address per block^3 */ 780 778 __u32 s_apbmask; /* address per block mask */ 781 779 __u32 s_apbshift; /* address per block shift */ 782 - __u32 s_2apbshift; /* address per block shift * 2 */ 783 - __u32 s_3apbshift; /* address per block shift * 3 */ 784 780 __u32 s_nspfshift; /* number of sector per fragment shift */ 785 781 __u32 s_nspb; /* number of sector per block */ 786 782 __u32 s_inopf; /* inodes per fragment */