Index: src/sys/dev/raidframe/rf_disks.c =================================================================== --- src/sys/dev/raidframe/rf_disks.c 8 Dec 2019 12:14:40 -0000 1.92 +++ src/sys/dev/raidframe/rf_disks.c 7 Aug 2022 04:56:34 -0000 @@ -318,11 +318,12 @@ static int rf_AllocDiskStructures(RF_Raid_t *raidPtr, RF_Config_t *cfgPtr) { int ret; + size_t entries = raidPtr->numCol + RF_MAXSPARE; /* We allocate RF_MAXSPARE on the first row so that we have room to do hot-swapping of spares */ - raidPtr->Disks = RF_MallocAndAdd((raidPtr->numCol + RF_MAXSPARE) * - sizeof(*raidPtr->Disks), raidPtr->cleanupList); + raidPtr->Disks = RF_MallocAndAdd( + entries * sizeof(*raidPtr->Disks), raidPtr->cleanupList); if (raidPtr->Disks == NULL) { ret = ENOMEM; goto fail; @@ -330,9 +331,7 @@ rf_AllocDiskStructures(RF_Raid_t *raidPt /* get space for device specific stuff.. */ raidPtr->raid_cinfo = RF_MallocAndAdd( - (raidPtr->numCol + RF_MAXSPARE) * sizeof(*raidPtr->raid_cinfo), - raidPtr->cleanupList); - + entries * sizeof(*raidPtr->raid_cinfo), raidPtr->cleanupList); if (raidPtr->raid_cinfo == NULL) { ret = ENOMEM; goto fail; @@ -607,7 +606,7 @@ rf_ConfigureDisk(RF_Raid_t *raidPtr, cha error = vn_bdev_openpath(pb, &vp, curlwp); pathbuf_destroy(pb); if (error) { - printf("open device: %s failed!\n", diskPtr->devname); + printf("open device: '%s' failed: %d\n", diskPtr->devname, error); if (error == ENXIO) { /* the component isn't there... must be dead :-( */ diskPtr->status = rf_ds_failed; Index: src/sys/dev/raidframe/rf_driver.c =================================================================== --- src/sys/dev/raidframe/rf_driver.c 23 Jul 2021 02:35:14 -0000 1.139 +++ src/sys/dev/raidframe/rf_driver.c 7 Aug 2022 04:56:34 -0000 @@ -341,6 +341,8 @@ rf_Configure(RF_Raid_t *raidPtr, RF_Conf (void (*) (void *)) rf_FreeAllocList, raidPtr->cleanupList); + KASSERT(cfgPtr->numCol < RF_MAXCOL && cfgPtr->numCol >= 0); + KASSERT(cfgPtr->numSpare < RF_MAXSPARE && cfgPtr->numSpare >= 0); raidPtr->numCol = cfgPtr->numCol; raidPtr->numSpare = cfgPtr->numSpare; Index: src/sys/dev/raidframe/rf_netbsdkintf.c =================================================================== --- src/sys/dev/raidframe/rf_netbsdkintf.c 16 Apr 2022 16:40:54 -0000 1.407 +++ src/sys/dev/raidframe/rf_netbsdkintf.c 7 Aug 2022 04:56:34 -0000 @@ -1240,7 +1240,7 @@ rf_getConfiguration(struct raid_softc *r int rf_construct(struct raid_softc *rs, RF_Config_t *k_cfg) { - int retcode; + int retcode, i; RF_Raid_t *raidPtr = &rs->sc_r; rs->sc_flags &= ~RAIDF_SHUTDOWN; @@ -1251,6 +1251,29 @@ rf_construct(struct raid_softc *rs, RF_C /* should do some kind of sanity check on the configuration. * Store the sum of all the bytes in the last byte? */ + /* Force nul-termination on all strings. */ +#define ZERO_FINAL(s) do { s[sizeof(s) - 1] = '\0'; } while (0) + for (i = 0; i < RF_MAXCOL; i++) { + ZERO_FINAL(k_cfg->devnames[0][i]); + } + for (i = 0; i < RF_MAXSPARE; i++) { + ZERO_FINAL(k_cfg->spare_names[i]); + } + for (i = 0; i < RF_MAXDBGV; i++) { + ZERO_FINAL(k_cfg->debugVars[i]); + } +#undef ZERO_FINAL + + /* Check some basic limits. */ + if (k_cfg->numCol >= RF_MAXCOL || k_cfg->numCol < 0) { + retcode = EINVAL; + goto out; + } + if (k_cfg->numSpare >= RF_MAXSPARE || k_cfg->numSpare < 0) { + retcode = EINVAL; + goto out; + } + /* configure the system */ /* @@ -1451,6 +1474,18 @@ rf_check_recon_status(RF_Raid_t *raidPtr return 0; } +/* + * Copy a RF_SingleComponent_t from 'data', ensuring nul-termination + * on the component_name[] array. + */ +static void +rf_copy_single_component(RF_SingleComponent_t *component, void *data) +{ + + memcpy(component, data, sizeof *component); + component->component_name[sizeof(component->component_name) - 1] = '\0'; +} + static int raidioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { @@ -1466,7 +1501,6 @@ raidioctl(dev_t dev, u_long cmd, void *d int retcode = 0; int column; RF_ComponentLabel_t *clabel; - RF_SingleComponent_t *sparePtr,*componentPtr; int d; if ((rs = raidget(unit, false)) == NULL) @@ -1555,21 +1589,18 @@ raidioctl(dev_t dev, u_long cmd, void *d rf_RewriteParityThread, raidPtr,"raid_parity"); case RAIDFRAME_ADD_HOT_SPARE: - sparePtr = (RF_SingleComponent_t *) data; - memcpy(&component, sparePtr, sizeof(RF_SingleComponent_t)); + rf_copy_single_component(&component, data); return rf_add_hot_spare(raidPtr, &component); case RAIDFRAME_REMOVE_HOT_SPARE: return retcode; case RAIDFRAME_DELETE_COMPONENT: - componentPtr = (RF_SingleComponent_t *)data; - memcpy(&component, componentPtr, sizeof(RF_SingleComponent_t)); + rf_copy_single_component(&component, data); return rf_delete_component(raidPtr, &component); case RAIDFRAME_INCORPORATE_HOT_SPARE: - componentPtr = (RF_SingleComponent_t *)data; - memcpy(&component, componentPtr, sizeof(RF_SingleComponent_t)); + rf_copy_single_component(&component, data); return rf_incorporate_hot_spare(raidPtr, &component); case RAIDFRAME_REBUILD_IN_PLACE: