return fd;
memset(&init, 0, sizeof(struct nvm_ioctl_dev_init));
- strncpy(init.dev, dev, DISK_NAME_LEN);
- strncpy(init.mmtype, mmtype, NVM_MMTYPE_LEN);
+ strncpy(init.dev, dev, DISK_NAME_LEN - 1);
+ strncpy(init.mmtype, mmtype, NVM_MMTYPE_LEN - 1);
ret = ioctl(fd, NVM_DEV_INIT, &init);
switch (errno) {
if (fd < 0)
return fd;
- strncpy(c.dev, devname, DISK_NAME_LEN);
- strncpy(c.tgtname, tgtname, DISK_NAME_LEN);
- strncpy(c.tgttype, tgttype, NVM_TTYPE_NAME_MAX);
+ strncpy(c.dev, devname, DISK_NAME_LEN - 1);
+ strncpy(c.tgtname, tgtname, DISK_NAME_LEN - 1);
+ strncpy(c.tgttype, tgttype, NVM_TTYPE_NAME_MAX - 1);
c.flags = flags;
/* Fall back into simple IOCTL version if no extended attributes used */
if (fd < 0)
return fd;
- strncpy(c.tgtname, tgtname, DISK_NAME_LEN);
+ strncpy(c.tgtname, tgtname, DISK_NAME_LEN - 1);
c.flags = 0;
ret = ioctl(fd, NVM_DEV_REMOVE, &c);
memset(&fact, 0, sizeof(struct nvm_ioctl_dev_factory));
- strncpy(fact.dev, devname, DISK_NAME_LEN);
+ strncpy(fact.dev, devname, DISK_NAME_LEN - 1);
if (erase_only_marked)
fact.flags |= NVM_FACTORY_ERASE_ONLY_USER;
if (clear_host_marks)
{
int i;
int ret;
+ int ctrl_sn_len = 20;
+ int res_len = 0;
char orig[PATH_MAX] = {0};
struct nvme_id_ctrl ctrl;
i = sizeof (ctrl.sn) - 1;
- strncpy(orig, file, PATH_MAX);
+ strncpy(orig, file, PATH_MAX - 1);
memset(file, 0, len);
memset(&ctrl, 0, sizeof (struct nvme_id_ctrl));
ret = nvme_identify_ctrl(fd, &ctrl);
ctrl.sn[i] = '\0';
i--;
}
- snprintf(file, len, "%s%s%s.bin", orig, ctrl.sn, suffix);
+
+ if (ctrl.sn[sizeof (ctrl.sn) - 1] == '\0') {
+ ctrl_sn_len = strlen(ctrl.sn);
+ }
+
+ res_len = snprintf(file, len, "%s%.*s%s.bin", orig, ctrl_sn_len, ctrl.sn, suffix);
+ if (len <= res_len) {
+ fprintf(stderr, "ERROR : WDC : cannot format serial number due to data "
+ "of unexpected length\n");
+ return -1;
+ }
+
return 0;
}
wdc_check_device(fd);
if (cfg.file != NULL) {
- strncpy(f, cfg.file, PATH_MAX);
+ strncpy(f, cfg.file, PATH_MAX - 1);
}
if (wdc_get_serial_name(fd, f, PATH_MAX, "cap_diag") == -1) {
fprintf(stderr, "ERROR : WDC: failed to generate file name\n");
char f[PATH_MAX] = {0};
if (file != NULL) {
- strncpy(f, file, PATH_MAX);
+ strncpy(f, file, PATH_MAX - 1);
}
if (wdc_get_serial_name(fd, f, PATH_MAX, "crash_dump") == -1) {
fprintf(stderr, "ERROR : WDC : failed to generate file name\n");
wdc_check_device(fd);
if (cfg.file != NULL) {
- strncpy(f, cfg.file, PATH_MAX);
+ strncpy(f, cfg.file, PATH_MAX - 1);
}
if (wdc_get_serial_name(fd, f, PATH_MAX, "drive_log") == -1) {
fprintf(stderr, "ERROR : WDC : failed to generate file name\n");
}
if (cfg.dirName != NULL) {
- strncpy(d, cfg.dirName, PATH_MAX);
+ strncpy(d, cfg.dirName, PATH_MAX - 1);
d_ptr = d;
} else {
d_ptr = NULL;