From b6c33b696cc965d3d5eb78168c7a5d97bf19c576 Mon Sep 17 00:00:00 2001 From: mrg Date: Sun, 6 Oct 2019 00:05:10 +0000 Subject: [PATCH] avoid calling snprintf/strlcat with an input parameter the same as the output. from martin@. fixes gcc 8 restrict warnings. --- usr.sbin/sysinst/Makefile.inc | 4 +- usr.sbin/sysinst/partman.c | 177 ++++++++++++++++++++++------------ 2 files changed, 117 insertions(+), 64 deletions(-) diff --git a/usr.sbin/sysinst/Makefile.inc b/usr.sbin/sysinst/Makefile.inc index eda29f73ee64..6d1d1836d520 100644 --- a/usr.sbin/sysinst/Makefile.inc +++ b/usr.sbin/sysinst/Makefile.inc @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.24 2019/10/04 09:47:28 mrg Exp $ +# $NetBSD: Makefile.inc,v 1.25 2019/10/06 00:05:10 mrg Exp $ # # Makefile for sysinst @@ -127,7 +127,7 @@ COPTS+=-Wno-format-truncation .endif # XXX overlapping strncpy/snprintf buffers! -COPTS.partman.c+= ${${ACTIVE_CC} == "gcc" && ${HAVE_GCC:U0} == 8:? -Wno-error :} +#COPTS.partman.c+= ${${ACTIVE_CC} == "gcc" && ${HAVE_GCC:U0} == 8:? -Wno-error :} # Host to ftp from. Default: # "ftp.NetBSD.org" diff --git a/usr.sbin/sysinst/partman.c b/usr.sbin/sysinst/partman.c index 9b053bfd9a42..9d21b257504f 100644 --- a/usr.sbin/sysinst/partman.c +++ b/usr.sbin/sysinst/partman.c @@ -1,4 +1,4 @@ -/* $NetBSD: partman.c,v 1.42 2019/08/13 17:57:49 martin Exp $ */ +/* $NetBSD: partman.c,v 1.43 2019/10/06 00:05:10 mrg Exp $ */ /* * Copyright 2012 Eugene Lozovoy @@ -950,7 +950,8 @@ pm_vnd_edit_menufmt(menudesc *m, int opt, void *arg) break; case PMV_MENU_NSECTORS: if (dev_ptr->manual_geom && !dev_ptr->is_exist) - snprintf(buf, SSTRSIZE, "%d", dev_ptr->nsectors); + snprintf(buf, SSTRSIZE, "%d", + dev_ptr->nsectors); wprintw(m->mw, "%*s %s", -lcol_width, msg_string(MSG_vnd_spt_fmt), buf); break; @@ -962,7 +963,8 @@ pm_vnd_edit_menufmt(menudesc *m, int opt, void *arg) break; case PMV_MENU_NCYLINDERS: if (dev_ptr->manual_geom && !dev_ptr->is_exist) - snprintf(buf, SSTRSIZE, "%d", dev_ptr->ncylinders); + snprintf(buf, SSTRSIZE, "%d", + dev_ptr->ncylinders); wprintw(m->mw, "%*s %s", -lcol_width, msg_string(MSG_vnd_cyl_fmt), buf); break; @@ -983,10 +985,13 @@ pm_vnd_set_value(menudesc *m, void *arg) dev_ptr->filepath, dev_ptr->filepath, STRSIZE); if (dev_ptr->filepath[0] != '/') { strlcpy(buf, dev_ptr->filepath, MOUNTLEN); - snprintf(dev_ptr->filepath, MOUNTLEN, "/%s", buf); + snprintf(dev_ptr->filepath, MOUNTLEN, "/%s", + buf); } - if (dev_ptr->filepath[strlen(dev_ptr->filepath) - 1] == '/') - dev_ptr->filepath[strlen(dev_ptr->filepath) - 1] = '\0'; + if (dev_ptr->filepath[strlen(dev_ptr->filepath) - 1] + == '/') + dev_ptr->filepath[strlen(dev_ptr->filepath) + - 1] = '\0'; return 0; case PMV_MENU_EXIST: dev_ptr->is_exist = !dev_ptr->is_exist; @@ -1540,15 +1545,18 @@ pm_lvm_edit_menufmt(menudesc *m, int opt, void *arg) int i; char buf[STRSIZE]; lvms_t *dev_ptr = arg; - strlcpy(buf, msg_string(MSG_auto), STRSIZE); + strlcpy(buf, msg_string(MSG_auto), sizeof buf); switch (opt) { case PML_MENU_PV: buf[0] = '\0'; - for (i = 0; i < MAX_LVM_PV; i++) - if (dev_ptr->pv[i].pm != NULL) - snprintf(buf, STRSIZE, "%s %s", - buf, dev_ptr->pv[i].pm_name); + for (i = 0; i < MAX_LVM_PV; i++) { + if (dev_ptr->pv[i].pm != NULL) { + strlcat(buf, " ", sizeof buf); + strlcat(buf, dev_ptr->pv[i].pm_name, + sizeof buf); + } + } wprintw(m->mw, "%-20s: %s", msg_string(MSG_lvm_disks_fmt), buf); break; @@ -1565,13 +1573,15 @@ pm_lvm_edit_menufmt(menudesc *m, int opt, void *arg) break; case PML_MENU_MAXPHYSICALVOLUMES: if (dev_ptr->maxphysicalvolumes > 0) - snprintf(buf, STRSIZE, "%d", dev_ptr->maxphysicalvolumes); + snprintf(buf, STRSIZE, "%d", + dev_ptr->maxphysicalvolumes); wprintw(m->mw, "%-20s: %s", msg_string(MSG_lvm_maxpv_fmt), buf); break; case PML_MENU_PHYSICALEXTENTSIZE: if (dev_ptr->physicalextentsize > 0) - snprintf(buf, STRSIZE, "%dM", dev_ptr->physicalextentsize); + snprintf(buf, STRSIZE, "%dM", + dev_ptr->physicalextentsize); wprintw(m->mw, "%-20s: %s", msg_string(MSG_lvm_extsiz_fmt), buf); break; @@ -1872,8 +1882,7 @@ pm_lvm_commit(void) { int i, ii, error; uint used_size = 0; - char params[STRSIZE*3]; - char devs[STRSIZE*3]; + char params[STRSIZE*3], devs[STRSIZE*3], arg[STRSIZE]; for (i = 0; i < MAX_LVM_VG; i++) { /* Stage 0: checks */ @@ -1891,26 +1900,37 @@ pm_lvm_commit(void) for (ii = 0; ii < MAX_LVM_PV && ! error; ii++) if (lvms[i].pv[ii].pm != NULL) { run_program(RUN_SILENT | RUN_ERROR_OK, - "lvm pvremove -ffy /dev/r%s", - (char*)lvms[i].pv[ii].pm_name); + "lvm pvremove -ffy /dev/r%s", + (char*)lvms[i].pv[ii].pm_name); error += run_program(RUN_DISPLAY | RUN_PROGRESS, - "lvm pvcreate -ffy /dev/r%s", - (char*)lvms[i].pv[ii].pm_name); + "lvm pvcreate -ffy /dev/r%s", + (char*)lvms[i].pv[ii].pm_name); if (error) break; - snprintf(devs, STRSIZE*3, "%s /dev/r%s", devs, (char*)lvms[i].pv[ii].pm_name); + strlcat(devs, " /dev/r", sizeof devs); + strlcat(devs, lvms[i].pv[ii].pm_name, + sizeof devs); } if (error) continue; /* Stage 2: creating Volume Groups (VG's) */ - if (lvms[i].maxlogicalvolumes > 0) - snprintf(params, STRSIZE*3, "%s -l %d", params, lvms[i].maxlogicalvolumes); - if (lvms[i].maxphysicalvolumes > 0) - snprintf(params, STRSIZE*3, "%s -p %d", params, lvms[i].maxphysicalvolumes); - if (lvms[i].physicalextentsize > 0) - snprintf(params, STRSIZE*3, "%s -s %d", params, lvms[i].physicalextentsize); - error += run_program(RUN_DISPLAY | RUN_PROGRESS, "lvm vgcreate %s %s %s", - params, lvms[i].name, devs); + if (lvms[i].maxlogicalvolumes > 0) { + snprintf(arg, sizeof arg, " -l %d", + lvms[i].maxlogicalvolumes); + strlcat(params, arg, sizeof params); + } + if (lvms[i].maxphysicalvolumes > 0) { + snprintf(arg, sizeof arg, " -p %d", + lvms[i].maxphysicalvolumes); + strlcat(params, arg, sizeof params); + } + if (lvms[i].physicalextentsize > 0) { + snprintf(arg, sizeof arg, " -s %d", + lvms[i].physicalextentsize); + strlcat(params, arg, sizeof params); + } + error += run_program(RUN_DISPLAY | RUN_PROGRESS, + "lvm vgcreate %s %s %s", params, lvms[i].name, devs); if (error) continue; /* Stage 3: creating Logical Volumes (LV's) */ @@ -1919,30 +1939,62 @@ pm_lvm_commit(void) continue; params[0] = '\0'; - snprintf(params, STRSIZE*3, "%s -C %c", params, lvms[i].lv[ii].contiguous?'y':'n'); - snprintf(params, STRSIZE*3, "%s -M %c", params, lvms[i].lv[ii].persistent?'y':'n'); - snprintf(params, STRSIZE*3, "%s -p %s", params, lvms[i].lv[ii].readonly?"r":"rw"); - snprintf(params, STRSIZE*3, "%s -Z %c", params, lvms[i].lv[ii].zero?'y':'n'); - if (strlen(lvms[i].lv[ii].name) > 0) - snprintf(params, STRSIZE*3, "%s -n %s", params, lvms[i].lv[ii].name); - if (strlen(lvms[i].lv[ii].extents) > 0) - snprintf(params, STRSIZE*3, "%s -l %s", params, lvms[i].lv[ii].extents); - if (lvms[i].lv[ii].minor > 0) - snprintf(params, STRSIZE*3, "%s --minor %d", params, lvms[i].lv[ii].minor); + snprintf(arg, sizeof arg, " -C %c", + lvms[i].lv[ii].contiguous?'y':'n'); + strlcat(params, arg, sizeof params); + snprintf(arg, sizeof arg, " -M %c", + lvms[i].lv[ii].persistent?'y':'n'); + strlcat(params, arg, sizeof params); + snprintf(arg, sizeof arg, " -p %s", + lvms[i].lv[ii].readonly?"r":"rw"); + strlcat(params, arg, sizeof params); + snprintf(arg, sizeof arg, " -Z %c", + lvms[i].lv[ii].zero?'y':'n'); + strlcat(params, arg, sizeof params); + if (strlen(lvms[i].lv[ii].name) > 0) { + snprintf(arg, sizeof arg, " -n %s", + lvms[i].lv[ii].name); + strlcat(params, arg, sizeof params); + } + if (strlen(lvms[i].lv[ii].extents) > 0) { + snprintf(arg, sizeof arg, " -l %s", + lvms[i].lv[ii].extents); + strlcat(params, arg, sizeof params); + } + if (lvms[i].lv[ii].minor > 0) { + snprintf(arg, sizeof arg, " --minor %d", + lvms[i].lv[ii].minor); + strlcat(params, arg, sizeof params); + } if (lvms[i].lv[ii].mirrors > 0) { - snprintf(params, STRSIZE*3, "%s -m %d", params, lvms[i].lv[ii].mirrors); - if (lvms[i].lv[ii].regionsize > 0) - snprintf(params, STRSIZE*3, "%s -R %d", params, lvms[i].lv[ii].regionsize); + snprintf(arg, sizeof arg, " -m %d", + lvms[i].lv[ii].mirrors); + strlcat(params, arg, sizeof params); + if (lvms[i].lv[ii].regionsize > 0) { + snprintf(arg, sizeof arg, " -R %d", + lvms[i].lv[ii].regionsize); + strlcat(params, arg, sizeof params); + } + } + if (lvms[i].lv[ii].readahead > 0) { + snprintf(arg, sizeof arg, " -r %d", + lvms[i].lv[ii].readahead); + strlcat(params, arg, sizeof params); } - if (lvms[i].lv[ii].readahead > 0) - snprintf(params, STRSIZE*3, "%s -r %d", params, lvms[i].lv[ii].readahead); if (lvms[i].lv[ii].stripes > 0) { - snprintf(params, STRSIZE*3, "%s -i %d", params, lvms[i].lv[ii].stripes); - if (lvms[i].lv[ii].stripesize > 0) - snprintf(params, STRSIZE*3, "%s -I %d", params, lvms[i].lv[ii].stripesize); + snprintf(arg, sizeof arg, " -i %d", + lvms[i].lv[ii].stripes); + strlcat(params, arg, sizeof params); + if (lvms[i].lv[ii].stripesize > 0) { + snprintf(arg, sizeof arg, " -I %d", + lvms[i].lv[ii].stripesize); + strlcat(params, arg, sizeof params); + } } - snprintf(params, STRSIZE*3, "%s -L %" PRIi64 "M", - params, lvms[i].lv[ii].size); + snprintf(arg, sizeof arg, " -L %" PRIi64 "M", + lvms[i].lv[ii].size); + strlcat(params, arg, sizeof params); + error += run_program(RUN_DISPLAY | RUN_PROGRESS, "lvm lvcreate %s %s", params, lvms[i].name); } @@ -1968,7 +2020,7 @@ int pm_getrefdev(struct pm_devs *pm_cur) { int i, ii, dev_num, num_devs, num_devs_s; - char dev[SSTRSIZE]; dev[0] = '\0'; + char descr[SSTRSIZE], dev[SSTRSIZE] = ""; pm_cur->refdev = NULL; if (! strncmp(pm_cur->diskdev, "cgd", 3)) { @@ -1976,11 +2028,11 @@ pm_getrefdev(struct pm_devs *pm_cur) for (i = 0; i < MAX_CGD; i++) if (cgds[i].blocked && cgds[i].node == dev_num) { pm_cur->refdev = &cgds[i]; - snprintf(pm_cur->diskdev_descr, - sizeof(pm_cur->diskdev_descr), - "%s (%s, %s-%d)", - pm_cur->diskdev_descr, cgds[i].pm_name, + snprintf(descr, sizeof descr, + " (%s, %s-%d)", cgds[i].pm_name, cgds[i].enc_type, cgds[i].key_size); + strlcat(pm_cur->diskdev_descr, descr, + sizeof(pm_cur->diskdev_descr)); break; } } else if (! strncmp(pm_cur->diskdev, "vnd", 3)) { @@ -1991,11 +2043,10 @@ pm_getrefdev(struct pm_devs *pm_cur) vnds[i].pm->parts->pscheme->get_part_device( vnds[i].pm->parts, vnds[i].pm_part, dev, sizeof dev, NULL, plain_name, false); - snprintf(pm_cur->diskdev_descr, - sizeof(pm_cur->diskdev_descr), - "%s (%s, %s)", - pm_cur->diskdev_descr, dev, - vnds[i].filepath); + snprintf(descr, sizeof descr, " (%s, %s)", + dev, vnds[i].filepath); + strlcat(pm_cur->diskdev_descr, descr, + sizeof(pm_cur->diskdev_descr)); break; } } else if (! strncmp(pm_cur->diskdev, "raid", 4)) { @@ -2011,10 +2062,12 @@ pm_getrefdev(struct pm_devs *pm_cur) else num_devs++; } - snprintf(pm_cur->diskdev_descr, - sizeof(pm_cur->diskdev_descr), - "%s (lvl %d, %d disks, %d spare)", pm_cur->diskdev_descr, - raids[i].raid_level, num_devs, num_devs_s); + snprintf(descr, sizeof descr, + " (lvl %d, %d disks, %d spare)", + raids[i].raid_level, num_devs, + num_devs_s); + strlcat(pm_cur->diskdev_descr, descr, + sizeof(pm_cur->diskdev_descr)); break; } } else