3027 installgrub can segfault when encountering bogus data on disk

   1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 #ifndef _INSTALLGRUB_H
  26 #define _INSTALLGRUB_H
  27 
  28 #ifdef  __cplusplus
  29 extern "C" {
  30 #endif
  31 
  32 #include <sys/multiboot.h>
  33 #include "./../common/bblk_einfo.h"
  34 
  35 #define SECTOR_SIZE     (512)
  36 
  37 typedef struct _device_data {
  38         char            *path;
  39         char            *path_p0;
  40         uint8_t         type;
  41         int             part_fd;
  42         int             disk_fd;
  43         int             slice;
  44         int             partition;
  45         uint32_t        start_sector;
  46         char            boot_sector[SECTOR_SIZE];
  47 } ig_device_t;
  48 
  49 typedef struct _stage2_data {
  50         char                    *buf;
  51         char                    *file;
  52         char                    *extra;
  53         multiboot_header_t      *mboot;
  54         uint32_t                mboot_off;
  55         uint32_t                file_size;
  56         uint32_t                extra_size;
  57         uint32_t                buf_size;
  58         uint32_t                first_sector;
  59         uint32_t                pcfs_first_sectors[2];
  60 } ig_stage2_t;
  61 
  62 typedef struct _ig_data {
  63         char            stage1_buf[SECTOR_SIZE];
  64         ig_stage2_t     stage2;
  65         ig_device_t     device;
  66 } ig_data_t;
  67 
  68 enum ig_devtype_t {
  69         IG_DEV_X86BOOTPAR = 1,
  70         IG_DEV_SOLVTOC
  71 };
  72 
  73 #define is_bootpar(type)        (type == IG_DEV_X86BOOTPAR)
  74 
  75 #define STAGE2_MEMADDR          (0x8000)        /* loading addr of stage2 */
  76 
  77 #define STAGE1_BPB_OFFSET       (0x3)
  78 #define STAGE1_BPB_SIZE         (0x3B)
  79 #define STAGE1_BOOT_DRIVE       (0x40)
  80 #define STAGE1_FORCE_LBA        (0x41)
  81 #define STAGE1_STAGE2_ADDRESS   (0x42)
  82 #define STAGE1_STAGE2_SECTOR    (0x44)
  83 #define STAGE1_STAGE2_SEGMENT   (0x48)
  84 
  85 #define STAGE2_BLOCKLIST        (SECTOR_SIZE - 0x8)
  86 #define STAGE2_INSTALLPART      (SECTOR_SIZE + 0x8)
  87 #define STAGE2_FORCE_LBA        (SECTOR_SIZE + 0x11)
  88 #define STAGE2_BLKOFF           (50)    /* offset from start of fdisk part */
  89 
  90 #ifdef  __cplusplus
  91 }
  92 #endif
  93 
  94 #endif /* _INSTALLGRUB_H */
--- EOF ---