mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
95a55437dc
The Amiga partition parser module uses signed int for partition sector address and count, which will overflow for disks larger than 1 TB. Use u64 as type for sector address and size to allow using disks up to 2 TB without LBD support, and disks larger than 2 TB with LBD. The RBD format allows to specify disk sizes up to 2^128 bytes (though native OS limitations reduce this somewhat, to max 2^68 bytes), so check for u64 overflow carefully to protect against overflowing sector_t. This bug was reported originally in 2012, and the fix was created by the RDB author, Joanne Dow <jdow@earthlink.net>. A patch had been discussed and reviewed on linux-m68k at that time but never officially submitted (now resubmitted as patch 1 of this series). Patch 3 (this series) adds additional error checking and warning messages. One of the error checks now makes use of the previously unused rdb_CylBlocks field, which causes a 'sparse' warning (cast to restricted __be32). Annotate all 32 bit fields in affs_hardblocks.h as __be32, as the on-disk format of RDB and partition blocks is always big endian. Reported-by: Martin Steigerwald <Martin@lichtvoll.de> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=43511 Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Message-ID: <201206192146.09327.Martin@lichtvoll.de> Cc: <stable@vger.kernel.org> # 5.2 Signed-off-by: Michael Schmitz <schmitzmic@gmail.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org> Link: https://lore.kernel.org/r/20230620201725.7020-3-schmitzmic@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
70 lines
1.5 KiB
C
70 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
#ifndef AFFS_HARDBLOCKS_H
|
|
#define AFFS_HARDBLOCKS_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/* Just the needed definitions for the RDB of an Amiga HD. */
|
|
|
|
struct RigidDiskBlock {
|
|
__be32 rdb_ID;
|
|
__be32 rdb_SummedLongs;
|
|
__be32 rdb_ChkSum;
|
|
__be32 rdb_HostID;
|
|
__be32 rdb_BlockBytes;
|
|
__be32 rdb_Flags;
|
|
__be32 rdb_BadBlockList;
|
|
__be32 rdb_PartitionList;
|
|
__be32 rdb_FileSysHeaderList;
|
|
__be32 rdb_DriveInit;
|
|
__be32 rdb_Reserved1[6];
|
|
__be32 rdb_Cylinders;
|
|
__be32 rdb_Sectors;
|
|
__be32 rdb_Heads;
|
|
__be32 rdb_Interleave;
|
|
__be32 rdb_Park;
|
|
__be32 rdb_Reserved2[3];
|
|
__be32 rdb_WritePreComp;
|
|
__be32 rdb_ReducedWrite;
|
|
__be32 rdb_StepRate;
|
|
__be32 rdb_Reserved3[5];
|
|
__be32 rdb_RDBBlocksLo;
|
|
__be32 rdb_RDBBlocksHi;
|
|
__be32 rdb_LoCylinder;
|
|
__be32 rdb_HiCylinder;
|
|
__be32 rdb_CylBlocks;
|
|
__be32 rdb_AutoParkSeconds;
|
|
__be32 rdb_HighRDSKBlock;
|
|
__be32 rdb_Reserved4;
|
|
char rdb_DiskVendor[8];
|
|
char rdb_DiskProduct[16];
|
|
char rdb_DiskRevision[4];
|
|
char rdb_ControllerVendor[8];
|
|
char rdb_ControllerProduct[16];
|
|
char rdb_ControllerRevision[4];
|
|
__be32 rdb_Reserved5[10];
|
|
};
|
|
|
|
#define IDNAME_RIGIDDISK 0x5244534B /* "RDSK" */
|
|
|
|
struct PartitionBlock {
|
|
__be32 pb_ID;
|
|
__be32 pb_SummedLongs;
|
|
__be32 pb_ChkSum;
|
|
__be32 pb_HostID;
|
|
__be32 pb_Next;
|
|
__be32 pb_Flags;
|
|
__be32 pb_Reserved1[2];
|
|
__be32 pb_DevFlags;
|
|
__u8 pb_DriveName[32];
|
|
__be32 pb_Reserved2[15];
|
|
__be32 pb_Environment[17];
|
|
__be32 pb_EReserved[15];
|
|
};
|
|
|
|
#define IDNAME_PARTITION 0x50415254 /* "PART" */
|
|
|
|
#define RDB_ALLOCATION_LIMIT 16
|
|
|
|
#endif /* AFFS_HARDBLOCKS_H */
|