Module Name: src Committed By: rin Date: Fri Aug 4 03:45:07 UTC 2023
Modified Files: src/sbin/bioctl: bioctl.c Log Message: bioctl(8): bio_show_volumes(): Do not return pointer to stack. Found by GCC 12. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sbin/bioctl/bioctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/bioctl/bioctl.c diff -u src/sbin/bioctl/bioctl.c:1.19 src/sbin/bioctl/bioctl.c:1.20 --- src/sbin/bioctl/bioctl.c:1.19 Tue May 10 14:16:25 2022 +++ src/sbin/bioctl/bioctl.c Fri Aug 4 03:45:07 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: bioctl.c,v 1.19 2022/05/10 14:16:25 msaitoh Exp $ */ +/* $NetBSD: bioctl.c,v 1.20 2023/08/04 03:45:07 rin Exp $ */ /* $OpenBSD: bioctl.c,v 1.52 2007/03/20 15:26:06 jmc Exp $ */ /* @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: bioctl.c,v 1.19 2022/05/10 14:16:25 msaitoh Exp $"); +__RCSID("$NetBSD: bioctl.c,v 1.20 2023/08/04 03:45:07 rin Exp $"); #endif #include <sys/types.h> @@ -78,7 +78,7 @@ struct locator { __dead static void usage(void); static void bio_alarm(int, int, char **); static void bio_show_common(int, int, char **); -static int bio_show_volumes(struct biotmp *); +static int bio_show_volumes(struct biotmp *, struct bioc_vol *); static void bio_show_disks(struct biotmp *); static void bio_setblink(int, int, char **); static void bio_blink(int, char *, int, int); @@ -232,34 +232,33 @@ str2locator(const char *string, struct l * Shows info about available RAID volumes. */ static int -bio_show_volumes(struct biotmp *bt) +bio_show_volumes(struct biotmp *bt, struct bioc_vol *bv) { - struct bioc_vol bv; const char *status, *rtypestr, *stripestr; char size[64], percent[16], seconds[20]; char rtype[16], stripe[16], tmp[48]; rtypestr = stripestr = NULL; - memset(&bv, 0, sizeof(bv)); - bv.bv_cookie = bl.bl_cookie; - bv.bv_volid = bt->volid; - bv.bv_percent = -1; - bv.bv_seconds = 0; + memset(bv, 0, sizeof(*bv)); + bv->bv_cookie = bl.bl_cookie; + bv->bv_volid = bt->volid; + bv->bv_percent = -1; + bv->bv_seconds = 0; - if (ioctl(bt->fd, BIOCVOL, &bv) == -1) + if (ioctl(bt->fd, BIOCVOL, bv) == -1) err(EXIT_FAILURE, "BIOCVOL"); percent[0] = '\0'; seconds[0] = '\0'; - if (bv.bv_percent != -1) + if (bv->bv_percent != -1) snprintf(percent, sizeof(percent), - " %3.2f%% done", bv.bv_percent / 10.0); - if (bv.bv_seconds) + " %3.2f%% done", bv->bv_percent / 10.0); + if (bv->bv_seconds) snprintf(seconds, sizeof(seconds), - " %u seconds", bv.bv_seconds); + " %u seconds", bv->bv_seconds); - switch (bv.bv_status) { + switch (bv->bv_status) { case BIOC_SVONLINE: status = BIOC_SVONLINE_S; break; @@ -290,13 +289,13 @@ bio_show_volumes(struct biotmp *bt) break; } - snprintf(bt->volname, sizeof(bt->volname), "%u", bv.bv_volid); - if (bv.bv_vendor[0]) - snprintf(tmp, sizeof(tmp), "%s %s", bv.bv_dev, bv.bv_vendor); + snprintf(bt->volname, sizeof(bt->volname), "%u", bv->bv_volid); + if (bv->bv_vendor[0]) + snprintf(tmp, sizeof(tmp), "%s %s", bv->bv_dev, bv->bv_vendor); else - snprintf(tmp, sizeof(tmp), "%s", bv.bv_dev); + snprintf(tmp, sizeof(tmp), "%s", bv->bv_dev); - switch (bv.bv_level) { + switch (bv->bv_level) { case BIOC_SVOL_HOTSPARE: rtypestr = "Hot spare"; stripestr = "N/A"; @@ -312,8 +311,8 @@ bio_show_volumes(struct biotmp *bt) rtypestr = "RAID 1+0"; break; default: - snprintf(rtype, sizeof(rtype), "RAID %u", bv.bv_level); - if (bv.bv_level == 1 || bv.bv_stripe_size == 0) + snprintf(rtype, sizeof(rtype), "RAID %u", bv->bv_level); + if (bv->bv_level == 1 || bv->bv_stripe_size == 0) stripestr = "N/A"; break; } @@ -323,18 +322,18 @@ bio_show_volumes(struct biotmp *bt) if (stripestr) strlcpy(stripe, stripestr, sizeof(stripe)); else - snprintf(stripe, sizeof(stripe), "%uK", bv.bv_stripe_size); + snprintf(stripe, sizeof(stripe), "%uK", bv->bv_stripe_size); - humanize_number(size, 5, (int64_t)bv.bv_size, "", HN_AUTOSCALE, + humanize_number(size, 5, (int64_t)bv->bv_size, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); printf("%6s %-12s %4s %20s %8s %6s %s%s\n", bt->volname, status, size, tmp, rtype, stripe, percent, seconds); - bt->bv = &bv; + bt->bv = bv; - return bv.bv_nodisk; + return bv->bv_nodisk; } /* @@ -431,6 +430,7 @@ bio_show_common(int fd, int argc, char * { struct biotmp *biot; struct bioc_inq bi; + struct bioc_vol bv; int i, d, ndisks; bool show_all, show_disks; bool show_vols, show_caps; @@ -491,7 +491,7 @@ bio_show_common(int fd, int argc, char * for (i = 0; i < bi.bi_novol; i++) { biot->format = true; biot->volid = i; - ndisks = bio_show_volumes(biot); + ndisks = bio_show_volumes(biot, &bv); if (show_vols) continue;