Module Name: src Committed By: martin Date: Sat Nov 25 19:43:26 UTC 2023
Modified Files: src/usr.sbin/sysinst: partman.c Log Message: PR 57698: avoid a few potential sysinst crashes in environments where not all binaries are available - e.g. w/o cgdconfig(8) the "cgds" pointer would be NULL (as there can't be any) and we crashed when naively dereferencing it. To generate a diff of this commit: cvs rdiff -u -r1.56 -r1.57 src/usr.sbin/sysinst/partman.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/sysinst/partman.c diff -u src/usr.sbin/sysinst/partman.c:1.56 src/usr.sbin/sysinst/partman.c:1.57 --- src/usr.sbin/sysinst/partman.c:1.56 Sun Jul 10 10:52:41 2022 +++ src/usr.sbin/sysinst/partman.c Sat Nov 25 19:43:26 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: partman.c,v 1.56 2022/07/10 10:52:41 martin Exp $ */ +/* $NetBSD: partman.c,v 1.57 2023/11/25 19:43:26 martin Exp $ */ /* * Copyright 2012 Eugene Lozovoy @@ -817,6 +817,8 @@ pm_raid_commit(void) FILE *f; char f_name[STRSIZE], devname[STRSIZE]; + if (!have_raid) + return 0; for (i = 0; i < MAX_RAID; i++) { if (! pm_raid_check(&raids[i])) continue; @@ -1163,6 +1165,8 @@ pm_vnd_commit(void) part_id id, part_suit = NO_PART; struct disk_part_info info; + if (!have_vnd) + return 0; for (i = 0; i < MAX_VND; i++) { error = 0; if (! pm_vnd_check(&vnds[i])) @@ -1454,6 +1458,8 @@ pm_cgd_commit(void) char devname[STRSIZE]; int i, error = 0; + if (!have_cgd) + return 0; for (i = 0; i < MAX_CGD; i++) { if (! pm_cgd_check(&cgds[i])) continue; @@ -1979,6 +1985,8 @@ pm_lvm_commit(void) uint used_size = 0; char params[STRSIZE*3], devs[STRSIZE*3], arg[STRSIZE]; + if (!have_lvm) + return 0; for (i = 0; i < MAX_LVM_VG; i++) { /* Stage 0: checks */ if (! pm_lvm_check(&lvms[i])) @@ -2118,7 +2126,7 @@ pm_getrefdev(struct pm_devs *pm_cur) char descr[MENUSTRSIZE], dev[MENUSTRSIZE] = ""; pm_cur->refdev = NULL; - if (! strncmp(pm_cur->diskdev, "cgd", 3)) { + if (have_cgd && strncmp(pm_cur->diskdev, "cgd", 3) == 0) { dev_num = pm_cur->diskdev[3] - '0'; for (i = 0; i < MAX_CGD; i++) if (cgds[i].blocked && cgds[i].node == dev_num) { @@ -2130,7 +2138,7 @@ pm_getrefdev(struct pm_devs *pm_cur) sizeof(pm_cur->diskdev_descr)); break; } - } else if (! strncmp(pm_cur->diskdev, "vnd", 3)) { + } else if (have_vnd && strncmp(pm_cur->diskdev, "vnd", 3) == 0) { dev_num = pm_cur->diskdev[3] - '0'; for (i = 0; i < MAX_VND; i++) if (vnds[i].blocked && vnds[i].node == dev_num) { @@ -2145,7 +2153,7 @@ pm_getrefdev(struct pm_devs *pm_cur) sizeof(pm_cur->diskdev_descr)); break; } - } else if (! strncmp(pm_cur->diskdev, "raid", 4)) { + } else if (have_raid && strncmp(pm_cur->diskdev, "raid", 4) == 0) { dev_num = pm_cur->diskdev[4] - '0'; for (i = 0; i < MAX_RAID; i++) if (raids[i].blocked && raids[i].node == dev_num) { @@ -2237,7 +2245,7 @@ pm_partusage(struct pm_devs *pm_cur, int if (id >= pm_cur->parts->num_part) return 0; - for (i = 0; i < MAX_CGD; i++) + for (i = 0; have_cgd && i < MAX_CGD; i++) if (cgds[i].enabled && cgds[i].pm == pm_cur && cgds[i].pm_part == id) { @@ -2247,7 +2255,7 @@ pm_partusage(struct pm_devs *pm_cur, int } return 1; } - for (i = 0; i < MAX_RAID; i++) + for (i = 0; have_raid && i < MAX_RAID; i++) for (ii = 0; ii < MAX_IN_RAID; ii++) if (raids[i].enabled && raids[i].comp[ii].parts == pm_cur->parts && @@ -2256,7 +2264,7 @@ pm_partusage(struct pm_devs *pm_cur, int raids[i].comp[ii].parts = NULL; return 1; } - for (i = 0; i < MAX_LVM_VG; i++) + for (i = 0; have_lvm && i < MAX_LVM_VG; i++) for (ii = 0; ii < MAX_LVM_PV; ii++) if (lvms[i].enabled && lvms[i].pv[ii].pm == pm_cur &&