fdisk: bb_common_bufsiz1 is too small for globals on 64-bit CPU
This commit is contained in:
parent
bd852076b9
commit
dfce08f281
@ -16,6 +16,8 @@
|
||||
# define USE_FEATURE_FDISK_BLKSIZE(a)
|
||||
#endif
|
||||
|
||||
#define SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
||||
|
||||
#define DEFAULT_SECTOR_SIZE 512
|
||||
#define MAX_SECTOR_SIZE 2048
|
||||
#define SECTOR_SIZE 512 /* still used in osf/sgi/sun code */
|
||||
@ -32,14 +34,6 @@
|
||||
#define LINUX_LVM 0x8e
|
||||
#define LINUX_RAID 0xfd
|
||||
|
||||
#define IS_EXTENDED(i) \
|
||||
((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED)
|
||||
|
||||
#define SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
||||
|
||||
#define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n))
|
||||
#define scround(x) (((x)+units_per_sector-1)/units_per_sector)
|
||||
|
||||
struct hd_geometry {
|
||||
unsigned char heads;
|
||||
unsigned char sectors;
|
||||
@ -91,6 +85,7 @@ enum failure {
|
||||
enum label_type {
|
||||
label_dos, label_sun, label_sgi, label_aix, label_osf
|
||||
};
|
||||
|
||||
#define LABEL_IS_DOS (label_dos == current_label_type)
|
||||
|
||||
#if ENABLE_FEATURE_SUN_LABEL
|
||||
@ -150,30 +145,6 @@ static int get_boot(enum action what);
|
||||
#define PLURAL 0
|
||||
#define SINGULAR 1
|
||||
|
||||
#define hex_val(c) ({ \
|
||||
char _c = (c); \
|
||||
isdigit(_c) ? _c - '0' : \
|
||||
tolower(_c) + 10 - 'a'; \
|
||||
})
|
||||
|
||||
#define LINE_LENGTH 80
|
||||
#define pt_offset(b, n) ((struct partition *)((b) + 0x1be + \
|
||||
(n) * sizeof(struct partition)))
|
||||
#define sector(s) ((s) & 0x3f)
|
||||
#define cylinder(s, c) ((c) | (((s) & 0xc0) << 2))
|
||||
|
||||
#define hsc2sector(h,s,c) (sector(s) - 1 + sectors * \
|
||||
((h) + heads * cylinder(s,c)))
|
||||
#define set_hsc(h,s,c,sector) \
|
||||
do { \
|
||||
s = sector % sectors + 1; \
|
||||
sector /= sectors; \
|
||||
h = sector % heads; \
|
||||
sector /= heads; \
|
||||
c = sector & 0xff; \
|
||||
s |= (sector >> 2) & 0xc0; \
|
||||
} while (0)
|
||||
|
||||
static unsigned get_start_sect(const struct partition *p);
|
||||
static unsigned get_nr_sects(const struct partition *p);
|
||||
|
||||
@ -188,40 +159,204 @@ static unsigned get_nr_sects(const struct partition *p);
|
||||
struct pte {
|
||||
struct partition *part_table; /* points into sectorbuffer */
|
||||
struct partition *ext_pointer; /* points into sectorbuffer */
|
||||
off_t offset; /* disk sector number */
|
||||
char *sectorbuffer; /* disk sector contents */
|
||||
#if ENABLE_FEATURE_FDISK_WRITABLE
|
||||
char changed; /* boolean */
|
||||
#endif
|
||||
off_t offset; /* disk sector number */
|
||||
char *sectorbuffer; /* disk sector contents */
|
||||
};
|
||||
|
||||
/* DOS partition types */
|
||||
|
||||
static const char *const i386_sys_types[] = {
|
||||
"\x00" "Empty",
|
||||
"\x01" "FAT12",
|
||||
"\x04" "FAT16 <32M",
|
||||
"\x05" "Extended", /* DOS 3.3+ extended partition */
|
||||
"\x06" "FAT16", /* DOS 16-bit >=32M */
|
||||
"\x07" "HPFS/NTFS", /* OS/2 IFS, eg, HPFS or NTFS or QNX */
|
||||
"\x0a" "OS/2 Boot Manager",/* OS/2 Boot Manager */
|
||||
"\x0b" "Win95 FAT32",
|
||||
"\x0c" "Win95 FAT32 (LBA)",/* LBA really is 'Extended Int 13h' */
|
||||
"\x0e" "Win95 FAT16 (LBA)",
|
||||
"\x0f" "Win95 Ext'd (LBA)",
|
||||
"\x11" "Hidden FAT12",
|
||||
"\x12" "Compaq diagnostics",
|
||||
"\x14" "Hidden FAT16 <32M",
|
||||
"\x16" "Hidden FAT16",
|
||||
"\x17" "Hidden HPFS/NTFS",
|
||||
"\x1b" "Hidden Win95 FAT32",
|
||||
"\x1c" "Hidden W95 FAT32 (LBA)",
|
||||
"\x1e" "Hidden W95 FAT16 (LBA)",
|
||||
"\x3c" "Part.Magic recovery",
|
||||
"\x41" "PPC PReP Boot",
|
||||
"\x42" "SFS",
|
||||
"\x63" "GNU HURD or SysV", /* GNU HURD or Mach or Sys V/386 (such as ISC UNIX) */
|
||||
"\x80" "Old Minix", /* Minix 1.4a and earlier */
|
||||
"\x81" "Minix / old Linux",/* Minix 1.4b and later */
|
||||
"\x82" "Linux swap", /* also Solaris */
|
||||
"\x83" "Linux",
|
||||
"\x84" "OS/2 hidden C: drive",
|
||||
"\x85" "Linux extended",
|
||||
"\x86" "NTFS volume set",
|
||||
"\x87" "NTFS volume set",
|
||||
"\x8e" "Linux LVM",
|
||||
"\x9f" "BSD/OS", /* BSDI */
|
||||
"\xa0" "Thinkpad hibernation",
|
||||
"\xa5" "FreeBSD", /* various BSD flavours */
|
||||
"\xa6" "OpenBSD",
|
||||
"\xa8" "Darwin UFS",
|
||||
"\xa9" "NetBSD",
|
||||
"\xab" "Darwin boot",
|
||||
"\xb7" "BSDI fs",
|
||||
"\xb8" "BSDI swap",
|
||||
"\xbe" "Solaris boot",
|
||||
"\xeb" "BeOS fs",
|
||||
"\xee" "EFI GPT", /* Intel EFI GUID Partition Table */
|
||||
"\xef" "EFI (FAT-12/16/32)", /* Intel EFI System Partition */
|
||||
"\xf0" "Linux/PA-RISC boot", /* Linux/PA-RISC boot loader */
|
||||
"\xf2" "DOS secondary", /* DOS 3.3+ secondary */
|
||||
"\xfd" "Linux raid autodetect", /* New (2.2.x) raid partition with
|
||||
autodetect using persistent
|
||||
superblock */
|
||||
#if 0 /* ENABLE_WEIRD_PARTITION_TYPES */
|
||||
"\x02" "XENIX root",
|
||||
"\x03" "XENIX usr",
|
||||
"\x08" "AIX", /* AIX boot (AIX -- PS/2 port) or SplitDrive */
|
||||
"\x09" "AIX bootable", /* AIX data or Coherent */
|
||||
"\x10" "OPUS",
|
||||
"\x18" "AST SmartSleep",
|
||||
"\x24" "NEC DOS",
|
||||
"\x39" "Plan 9",
|
||||
"\x40" "Venix 80286",
|
||||
"\x4d" "QNX4.x",
|
||||
"\x4e" "QNX4.x 2nd part",
|
||||
"\x4f" "QNX4.x 3rd part",
|
||||
"\x50" "OnTrack DM",
|
||||
"\x51" "OnTrack DM6 Aux1", /* (or Novell) */
|
||||
"\x52" "CP/M", /* CP/M or Microport SysV/AT */
|
||||
"\x53" "OnTrack DM6 Aux3",
|
||||
"\x54" "OnTrackDM6",
|
||||
"\x55" "EZ-Drive",
|
||||
"\x56" "Golden Bow",
|
||||
"\x5c" "Priam Edisk",
|
||||
"\x61" "SpeedStor",
|
||||
"\x64" "Novell Netware 286",
|
||||
"\x65" "Novell Netware 386",
|
||||
"\x70" "DiskSecure Multi-Boot",
|
||||
"\x75" "PC/IX",
|
||||
"\x93" "Amoeba",
|
||||
"\x94" "Amoeba BBT", /* (bad block table) */
|
||||
"\xa7" "NeXTSTEP",
|
||||
"\xbb" "Boot Wizard hidden",
|
||||
"\xc1" "DRDOS/sec (FAT-12)",
|
||||
"\xc4" "DRDOS/sec (FAT-16 < 32M)",
|
||||
"\xc6" "DRDOS/sec (FAT-16)",
|
||||
"\xc7" "Syrinx",
|
||||
"\xda" "Non-FS data",
|
||||
"\xdb" "CP/M / CTOS / ...",/* CP/M or Concurrent CP/M or
|
||||
Concurrent DOS or CTOS */
|
||||
"\xde" "Dell Utility", /* Dell PowerEdge Server utilities */
|
||||
"\xdf" "BootIt", /* BootIt EMBRM */
|
||||
"\xe1" "DOS access", /* DOS access or SpeedStor 12-bit FAT
|
||||
extended partition */
|
||||
"\xe3" "DOS R/O", /* DOS R/O or SpeedStor */
|
||||
"\xe4" "SpeedStor", /* SpeedStor 16-bit FAT extended
|
||||
partition < 1024 cyl. */
|
||||
"\xf1" "SpeedStor",
|
||||
"\xf4" "SpeedStor", /* SpeedStor large partition */
|
||||
"\xfe" "LANstep", /* SpeedStor >1024 cyl. or LANstep */
|
||||
"\xff" "BBT", /* Xenix Bad Block Table */
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
/* Globals */
|
||||
|
||||
struct globals {
|
||||
char *line_ptr;
|
||||
char line_buffer[80];
|
||||
char partname_buffer[80];
|
||||
jmp_buf listingbuf;
|
||||
/* Raw disk label. For DOS-type partition tables the MBR,
|
||||
* with descriptions of the primary partitions. */
|
||||
char MBRbuffer[MAX_SECTOR_SIZE];
|
||||
/* Partition tables */
|
||||
struct pte ptes[MAXIMUM_PARTS];
|
||||
};
|
||||
/* bb_common_bufsiz1 is too small for this on 64 bit CPUs */
|
||||
#define G (*ptr_to_globals)
|
||||
|
||||
#define G (*(struct globals*)bb_common_bufsiz1)
|
||||
#define MBRbuffer (G.MBRbuffer)
|
||||
#define ptes (G.ptes)
|
||||
#define line_ptr (G.line_ptr)
|
||||
#define listingbuf (G.listingbuf)
|
||||
#define line_buffer (G.line_buffer)
|
||||
#define partname_buffer (G.partname_buffer)
|
||||
#define MBRbuffer (G.MBRbuffer)
|
||||
#define ptes (G.ptes)
|
||||
|
||||
|
||||
/* Code */
|
||||
|
||||
#define IS_EXTENDED(i) \
|
||||
((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED)
|
||||
|
||||
#define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n))
|
||||
|
||||
#define scround(x) (((x)+units_per_sector-1)/units_per_sector)
|
||||
|
||||
#define pt_offset(b, n) \
|
||||
((struct partition *)((b) + 0x1be + (n) * sizeof(struct partition)))
|
||||
|
||||
#define sector(s) ((s) & 0x3f)
|
||||
|
||||
#define cylinder(s, c) ((c) | (((s) & 0xc0) << 2))
|
||||
|
||||
#define hsc2sector(h,s,c) \
|
||||
(sector(s) - 1 + sectors * ((h) + heads * cylinder(s,c)))
|
||||
|
||||
#define set_hsc(h,s,c,sector) \
|
||||
do { \
|
||||
s = sector % sectors + 1; \
|
||||
sector /= sectors; \
|
||||
h = sector % heads; \
|
||||
sector /= heads; \
|
||||
c = sector & 0xff; \
|
||||
s |= (sector >> 2) & 0xc0; \
|
||||
} while (0)
|
||||
|
||||
/* read line; return 0 or first printable char */
|
||||
static int
|
||||
read_line(const char *prompt)
|
||||
{
|
||||
int sz;
|
||||
|
||||
sz = read_line_input(prompt, line_buffer, sizeof(line_buffer), NULL);
|
||||
if (sz <= 0)
|
||||
exit(0); /* Ctrl-D or Ctrl-C */
|
||||
|
||||
if (line_buffer[sz-1] == '\n')
|
||||
line_buffer[--sz] = '\0';
|
||||
|
||||
line_ptr = line_buffer;
|
||||
while (*line_ptr && !isgraph(*line_ptr))
|
||||
line_ptr++;
|
||||
return *line_ptr;
|
||||
}
|
||||
|
||||
/*
|
||||
* return partition name - uses static storage
|
||||
*/
|
||||
static const char *
|
||||
partname(const char *dev, int pno, int lth)
|
||||
{
|
||||
static char buffer[80];
|
||||
const char *p;
|
||||
int w, wp;
|
||||
int bufsiz;
|
||||
char *bufp;
|
||||
|
||||
bufp = buffer;
|
||||
bufsiz = sizeof(buffer);
|
||||
bufp = partname_buffer;
|
||||
bufsiz = sizeof(partname_buffer);
|
||||
|
||||
w = strlen(dev);
|
||||
p = "";
|
||||
@ -292,28 +427,6 @@ write_part_table_flag(char *b)
|
||||
b[511] = 0xaa;
|
||||
}
|
||||
|
||||
static char line_buffer[LINE_LENGTH];
|
||||
static char *line_ptr;
|
||||
|
||||
/* read line; return 0 or first printable char */
|
||||
static int
|
||||
read_line(const char *prompt)
|
||||
{
|
||||
int sz;
|
||||
|
||||
sz = read_line_input(prompt, line_buffer, sizeof(line_buffer), NULL);
|
||||
if (sz <= 0)
|
||||
exit(0); /* Ctrl-D or Ctrl-C */
|
||||
|
||||
if (line_buffer[sz-1] == '\n')
|
||||
line_buffer[--sz] = '\0';
|
||||
|
||||
line_ptr = line_buffer;
|
||||
while (*line_ptr && !isgraph(*line_ptr))
|
||||
line_ptr++;
|
||||
return *line_ptr;
|
||||
}
|
||||
|
||||
static char
|
||||
read_nonempty(const char *mesg)
|
||||
{
|
||||
@ -439,112 +552,6 @@ STATIC_SUN void verify_sun(void);
|
||||
STATIC_SUN void sun_write_table(void);
|
||||
#include "fdisk_sun.c"
|
||||
|
||||
/* DOS partition types */
|
||||
|
||||
static const char *const i386_sys_types[] = {
|
||||
"\x00" "Empty",
|
||||
"\x01" "FAT12",
|
||||
"\x04" "FAT16 <32M",
|
||||
"\x05" "Extended", /* DOS 3.3+ extended partition */
|
||||
"\x06" "FAT16", /* DOS 16-bit >=32M */
|
||||
"\x07" "HPFS/NTFS", /* OS/2 IFS, eg, HPFS or NTFS or QNX */
|
||||
"\x0a" "OS/2 Boot Manager",/* OS/2 Boot Manager */
|
||||
"\x0b" "Win95 FAT32",
|
||||
"\x0c" "Win95 FAT32 (LBA)",/* LBA really is 'Extended Int 13h' */
|
||||
"\x0e" "Win95 FAT16 (LBA)",
|
||||
"\x0f" "Win95 Ext'd (LBA)",
|
||||
"\x11" "Hidden FAT12",
|
||||
"\x12" "Compaq diagnostics",
|
||||
"\x14" "Hidden FAT16 <32M",
|
||||
"\x16" "Hidden FAT16",
|
||||
"\x17" "Hidden HPFS/NTFS",
|
||||
"\x1b" "Hidden Win95 FAT32",
|
||||
"\x1c" "Hidden W95 FAT32 (LBA)",
|
||||
"\x1e" "Hidden W95 FAT16 (LBA)",
|
||||
"\x3c" "Part.Magic recovery",
|
||||
"\x41" "PPC PReP Boot",
|
||||
"\x42" "SFS",
|
||||
"\x63" "GNU HURD or SysV", /* GNU HURD or Mach or Sys V/386 (such as ISC UNIX) */
|
||||
"\x80" "Old Minix", /* Minix 1.4a and earlier */
|
||||
"\x81" "Minix / old Linux",/* Minix 1.4b and later */
|
||||
"\x82" "Linux swap", /* also Solaris */
|
||||
"\x83" "Linux",
|
||||
"\x84" "OS/2 hidden C: drive",
|
||||
"\x85" "Linux extended",
|
||||
"\x86" "NTFS volume set",
|
||||
"\x87" "NTFS volume set",
|
||||
"\x8e" "Linux LVM",
|
||||
"\x9f" "BSD/OS", /* BSDI */
|
||||
"\xa0" "Thinkpad hibernation",
|
||||
"\xa5" "FreeBSD", /* various BSD flavours */
|
||||
"\xa6" "OpenBSD",
|
||||
"\xa8" "Darwin UFS",
|
||||
"\xa9" "NetBSD",
|
||||
"\xab" "Darwin boot",
|
||||
"\xb7" "BSDI fs",
|
||||
"\xb8" "BSDI swap",
|
||||
"\xbe" "Solaris boot",
|
||||
"\xeb" "BeOS fs",
|
||||
"\xee" "EFI GPT", /* Intel EFI GUID Partition Table */
|
||||
"\xef" "EFI (FAT-12/16/32)", /* Intel EFI System Partition */
|
||||
"\xf0" "Linux/PA-RISC boot", /* Linux/PA-RISC boot loader */
|
||||
"\xf2" "DOS secondary", /* DOS 3.3+ secondary */
|
||||
"\xfd" "Linux raid autodetect", /* New (2.2.x) raid partition with
|
||||
autodetect using persistent
|
||||
superblock */
|
||||
#if 0 /* ENABLE_WEIRD_PARTITION_TYPES */
|
||||
"\x02" "XENIX root",
|
||||
"\x03" "XENIX usr",
|
||||
"\x08" "AIX", /* AIX boot (AIX -- PS/2 port) or SplitDrive */
|
||||
"\x09" "AIX bootable", /* AIX data or Coherent */
|
||||
"\x10" "OPUS",
|
||||
"\x18" "AST SmartSleep",
|
||||
"\x24" "NEC DOS",
|
||||
"\x39" "Plan 9",
|
||||
"\x40" "Venix 80286",
|
||||
"\x4d" "QNX4.x",
|
||||
"\x4e" "QNX4.x 2nd part",
|
||||
"\x4f" "QNX4.x 3rd part",
|
||||
"\x50" "OnTrack DM",
|
||||
"\x51" "OnTrack DM6 Aux1", /* (or Novell) */
|
||||
"\x52" "CP/M", /* CP/M or Microport SysV/AT */
|
||||
"\x53" "OnTrack DM6 Aux3",
|
||||
"\x54" "OnTrackDM6",
|
||||
"\x55" "EZ-Drive",
|
||||
"\x56" "Golden Bow",
|
||||
"\x5c" "Priam Edisk",
|
||||
"\x61" "SpeedStor",
|
||||
"\x64" "Novell Netware 286",
|
||||
"\x65" "Novell Netware 386",
|
||||
"\x70" "DiskSecure Multi-Boot",
|
||||
"\x75" "PC/IX",
|
||||
"\x93" "Amoeba",
|
||||
"\x94" "Amoeba BBT", /* (bad block table) */
|
||||
"\xa7" "NeXTSTEP",
|
||||
"\xbb" "Boot Wizard hidden",
|
||||
"\xc1" "DRDOS/sec (FAT-12)",
|
||||
"\xc4" "DRDOS/sec (FAT-16 < 32M)",
|
||||
"\xc6" "DRDOS/sec (FAT-16)",
|
||||
"\xc7" "Syrinx",
|
||||
"\xda" "Non-FS data",
|
||||
"\xdb" "CP/M / CTOS / ...",/* CP/M or Concurrent CP/M or
|
||||
Concurrent DOS or CTOS */
|
||||
"\xde" "Dell Utility", /* Dell PowerEdge Server utilities */
|
||||
"\xdf" "BootIt", /* BootIt EMBRM */
|
||||
"\xe1" "DOS access", /* DOS access or SpeedStor 12-bit FAT
|
||||
extended partition */
|
||||
"\xe3" "DOS R/O", /* DOS R/O or SpeedStor */
|
||||
"\xe4" "SpeedStor", /* SpeedStor 16-bit FAT extended
|
||||
partition < 1024 cyl. */
|
||||
"\xf1" "SpeedStor",
|
||||
"\xf4" "SpeedStor", /* SpeedStor large partition */
|
||||
"\xfe" "LANstep", /* SpeedStor >1024 cyl. or LANstep */
|
||||
"\xff" "BBT", /* Xenix Bad Block Table */
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
#if ENABLE_FEATURE_FDISK_WRITABLE
|
||||
/* start_sect and nr_sects are stored little endian on all machines */
|
||||
/* moreover, they are not aligned correctly */
|
||||
@ -615,8 +622,6 @@ static off_t extended_offset; /* offset of link pointers */
|
||||
static unsigned long long total_number_of_sectors;
|
||||
|
||||
|
||||
static jmp_buf listingbuf;
|
||||
|
||||
static void fdisk_fatal(enum failure why)
|
||||
{
|
||||
const char *message;
|
||||
@ -2379,7 +2384,7 @@ new_partition(void)
|
||||
printf("You must delete some partition and add "
|
||||
"an extended partition first\n");
|
||||
} else {
|
||||
char c, line[LINE_LENGTH];
|
||||
char c, line[80];
|
||||
snprintf(line, sizeof(line),
|
||||
"Command action\n"
|
||||
" %s\n"
|
||||
@ -2761,8 +2766,6 @@ unknown_command(int c)
|
||||
}
|
||||
#endif
|
||||
|
||||
void BUG_fdisk_globals_overflow(void);
|
||||
|
||||
int fdisk_main(int argc, char **argv);
|
||||
int fdisk_main(int argc, char **argv)
|
||||
{
|
||||
@ -2786,8 +2789,7 @@ int fdisk_main(int argc, char **argv)
|
||||
OPT_s = (1 << 6) * ENABLE_FEATURE_FDISK_BLKSIZE,
|
||||
};
|
||||
|
||||
if (sizeof(G) > sizeof(bb_common_bufsiz1))
|
||||
BUG_fdisk_globals_overflow();
|
||||
PTR_TO_GLOBALS = xzalloc(sizeof(G));
|
||||
|
||||
opt = getopt32(argc, argv, "b:C:H:lS:u" USE_FEATURE_FDISK_BLKSIZE("s"),
|
||||
&str_b, &str_C, &str_H, &str_S);
|
||||
|
Loading…
Reference in New Issue
Block a user