Use the same logic in all copies of gpt_chk_mbr(), relaxing the
authorkrw <krw@openbsd.org>
Wed, 2 Jun 2021 22:44:26 +0000 (22:44 +0000)
committerkrw <krw@openbsd.org>
Wed, 2 Jun 2021 22:44:26 +0000 (22:44 +0000)
media length check to allow EFI GPT partitions to be smaller that
the entire disk.

Consistently use GPTSECTOR instead of randomly tossing in some
literal '1's.

ok kettenis@

sbin/fdisk/mbr.c
sys/arch/amd64/stand/efiboot/efidev.c
sys/arch/amd64/stand/libsa/softraid_amd64.c
sys/arch/arm64/stand/efiboot/efidev.c
sys/arch/arm64/stand/efiboot/softraid_arm64.c
sys/arch/armv7/stand/efiboot/efidev.c
sys/arch/riscv64/stand/efiboot/efidev.c
sys/arch/riscv64/stand/efiboot/softraid_riscv64.c
sys/kern/subr_disk.c
usr.sbin/installboot/armv7_installboot.c
usr.sbin/installboot/i386_installboot.c

index 6ccbc24..69479fd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mbr.c,v 1.72 2021/05/27 14:27:41 krw Exp $    */
+/*     $OpenBSD: mbr.c,v 1.73 2021/06/02 22:44:26 krw Exp $    */
 
 /*
  * Copyright (c) 1997 Tobias Weingartner
@@ -315,7 +315,7 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                if (letoh32(dp2->dp_start) != GPTSECTOR)
                        continue;
                psize = letoh32(dp2->dp_size);
-               if (psize <= (dsize - 1) || psize == UINT32_MAX) {
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX) {
                        efi = i;
                        eficnt++;
                }
index a6ce8fb..bbf248e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efidev.c,v 1.33 2021/03/17 05:41:34 yasuoka Exp $     */
+/*     $OpenBSD: efidev.c,v 1.34 2021/06/02 22:44:26 krw Exp $ */
 
 /*
  * Copyright (c) 1996 Michael Shalayeff
@@ -175,12 +175,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -308,8 +307,8 @@ findopenbsd_gpt(efi_diskinfo_t ed, const char **err)
                return (-1);
        }
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed),
            buf);
        if (EFI_ERROR(status)) {
index 7cc13c1..4c6099d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: softraid_amd64.c,v 1.6 2020/12/09 18:10:18 krw Exp $  */
+/*     $OpenBSD: softraid_amd64.c,v 1.7 2021/06/02 22:44:26 krw Exp $  */
 
 /*
  * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
@@ -410,12 +410,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -463,8 +462,8 @@ findopenbsd_gpt(struct sr_boot_volume *bv, const char **err)
        }
        bzero(buf, bv->sbv_secsize);
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        sr_strategy(bv, F_READ, lba * (bv->sbv_secsize / DEV_BSIZE), DEV_BSIZE,
            buf, NULL);
        memcpy(&gh, buf, sizeof(gh));
index a877173..902faa7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efidev.c,v 1.7 2021/06/02 15:31:15 kettenis Exp $     */
+/*     $OpenBSD: efidev.c,v 1.8 2021/06/02 22:44:27 krw Exp $  */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -164,12 +164,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -297,8 +296,8 @@ findopenbsd_gpt(efi_diskinfo_t ed, const char **err)
                return (-1);
        }
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed),
            buf);
        if (EFI_ERROR(status)) {
index 2435439..3717730 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: softraid_arm64.c,v 1.2 2020/12/09 18:10:18 krw Exp $  */
+/*     $OpenBSD: softraid_arm64.c,v 1.3 2021/06/02 22:44:27 krw Exp $  */
 
 /*
  * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
@@ -402,12 +402,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -455,8 +454,8 @@ findopenbsd_gpt(struct sr_boot_volume *bv, const char **err)
        }
        bzero(buf, bv->sbv_secsize);
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        sr_strategy(bv, F_READ, lba * (bv->sbv_secsize / DEV_BSIZE), DEV_BSIZE,
            buf, NULL);
        memcpy(&gh, buf, sizeof(gh));
index b79d6ba..c122750 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efidev.c,v 1.6 2020/12/09 18:10:18 krw Exp $  */
+/*     $OpenBSD: efidev.c,v 1.7 2021/06/02 22:44:27 krw Exp $  */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -150,12 +150,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -283,8 +282,8 @@ findopenbsd_gpt(efi_diskinfo_t ed, const char **err)
                return (-1);
        }
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed),
            buf);
        if (EFI_ERROR(status)) {
index fd8855b..ac14ab5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: efidev.c,v 1.1 2021/04/28 19:01:00 drahn Exp $        */
+/*     $OpenBSD: efidev.c,v 1.2 2021/06/02 22:44:27 krw Exp $  */
 
 /*
  * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -150,12 +150,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -283,8 +282,8 @@ findopenbsd_gpt(efi_diskinfo_t ed, const char **err)
                return (-1);
        }
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed),
            buf);
        if (EFI_ERROR(status)) {
index 0a521cc..d7691e0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: softraid_riscv64.c,v 1.1 2021/04/28 19:01:00 drahn Exp $      */
+/*     $OpenBSD: softraid_riscv64.c,v 1.2 2021/06/02 22:44:27 krw Exp $        */
 
 /*
  * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
@@ -402,12 +402,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
@@ -455,8 +454,8 @@ findopenbsd_gpt(struct sr_boot_volume *bv, const char **err)
        }
        bzero(buf, bv->sbv_secsize);
 
-       /* LBA1: GPT Header */
-       lba = 1;
+       /* GPT Header */
+       lba = GPTSECTOR;
        sr_strategy(bv, F_READ, lba * (bv->sbv_secsize / DEV_BSIZE), DEV_BSIZE,
            buf, NULL);
        memcpy(&gh, buf, sizeof(gh));
index 31b342c..4e454ae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: subr_disk.c,v 1.243 2021/06/01 22:54:43 krw Exp $     */
+/*     $OpenBSD: subr_disk.c,v 1.244 2021/06/02 22:44:27 krw Exp $     */
 /*     $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $  */
 
 /*
@@ -607,7 +607,7 @@ gpt_chk_mbr(struct dos_partition *dp, uint64_t dsize)
                if (letoh32(dp2->dp_start) != GPTSECTOR)
                        continue;
                psize = letoh32(dp2->dp_size);
-               if (psize <= (dsize - 1) || psize == UINT32_MAX) {
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX) {
                        efi = i;
                        eficnt++;
                }
index f262549..951218f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: armv7_installboot.c,v 1.7 2021/06/02 16:12:18 kettenis Exp $  */
+/*     $OpenBSD: armv7_installboot.c,v 1.8 2021/06/02 22:44:27 krw Exp $       */
 /*     $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
 
 /*
@@ -274,12 +274,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);
index 3153e0b..4a15560 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: i386_installboot.c,v 1.38 2020/07/22 05:06:38 deraadt Exp $   */
+/*     $OpenBSD: i386_installboot.c,v 1.39 2021/06/02 22:44:27 krw Exp $       */
 /*     $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
 
 /*
@@ -473,12 +473,11 @@ gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize)
                found++;
                if (dp2->dp_typ != DOSPTYP_EFI)
                        continue;
+               if (letoh32(dp2->dp_start) != GPTSECTOR)
+                       continue;
                psize = letoh32(dp2->dp_size);
-               if (psize == (dsize - 1) ||
-                   psize == UINT32_MAX) {
-                       if (letoh32(dp2->dp_start) == 1)
-                               efi++;
-               }
+               if (psize <= (dsize - GPTSECTOR) || psize == UINT32_MAX)
+                       efi++;
        }
        if (found == 1 && efi == 1)
                return (0);