Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e9207b0 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman
Browse files

scsi: mylex: Fix sysfs buffer lengths



[ Upstream commit 1197c5b2099f716b3de327437fb50900a0b936c9 ]

The myrb and myrs drivers use an odd way of implementing their sysfs files,
calling snprintf() with a fixed length of 32 bytes to print into a page
sized buffer. One of the strings is actually longer than 32 bytes, which
clang can warn about:

drivers/scsi/myrb.c:1906:10: error: 'snprintf' will always be truncated; specified size is 32, but format string expands to at least 34 [-Werror,-Wformat-truncation]
drivers/scsi/myrs.c:1089:10: error: 'snprintf' will always be truncated; specified size is 32, but format string expands to at least 34 [-Werror,-Wformat-truncation]

These could all be plain sprintf() without a length as the buffer is always
long enough. On the other hand, sysfs files should not be overly long
either, so just double the length to make sure the longest strings don't
get truncated here.

Fixes: 77266186 ("scsi: myrs: Add Mylex RAID controller (SCSI interface)")
Fixes: 081ff398 ("scsi: myrb: Add Mylex RAID controller (block interface)")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20240326223825.4084412-8-arnd@kernel.org


Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent d887674f
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -1803,9 +1803,9 @@ static ssize_t raid_state_show(struct device *dev,

		name = myrb_devstate_name(ldev_info->state);
		if (name)
			ret = snprintf(buf, 32, "%s\n", name);
			ret = snprintf(buf, 64, "%s\n", name);
		else
			ret = snprintf(buf, 32, "Invalid (%02X)\n",
			ret = snprintf(buf, 64, "Invalid (%02X)\n",
				       ldev_info->state);
	} else {
		struct myrb_pdev_state *pdev_info = sdev->hostdata;
@@ -1824,9 +1824,9 @@ static ssize_t raid_state_show(struct device *dev,
		else
			name = myrb_devstate_name(pdev_info->state);
		if (name)
			ret = snprintf(buf, 32, "%s\n", name);
			ret = snprintf(buf, 64, "%s\n", name);
		else
			ret = snprintf(buf, 32, "Invalid (%02X)\n",
			ret = snprintf(buf, 64, "Invalid (%02X)\n",
				       pdev_info->state);
	}
	return ret;
@@ -1914,11 +1914,11 @@ static ssize_t raid_level_show(struct device *dev,

		name = myrb_raidlevel_name(ldev_info->raid_level);
		if (!name)
			return snprintf(buf, 32, "Invalid (%02X)\n",
			return snprintf(buf, 64, "Invalid (%02X)\n",
					ldev_info->state);
		return snprintf(buf, 32, "%s\n", name);
		return snprintf(buf, 64, "%s\n", name);
	}
	return snprintf(buf, 32, "Physical Drive\n");
	return snprintf(buf, 64, "Physical Drive\n");
}
static DEVICE_ATTR_RO(raid_level);

@@ -1931,15 +1931,15 @@ static ssize_t rebuild_show(struct device *dev,
	unsigned char status;

	if (sdev->channel < myrb_logical_channel(sdev->host))
		return snprintf(buf, 32, "physical device - not rebuilding\n");
		return snprintf(buf, 64, "physical device - not rebuilding\n");

	status = myrb_get_rbld_progress(cb, &rbld_buf);

	if (rbld_buf.ldev_num != sdev->id ||
	    status != MYRB_STATUS_SUCCESS)
		return snprintf(buf, 32, "not rebuilding\n");
		return snprintf(buf, 64, "not rebuilding\n");

	return snprintf(buf, 32, "rebuilding block %u of %u\n",
	return snprintf(buf, 64, "rebuilding block %u of %u\n",
			rbld_buf.ldev_size - rbld_buf.blocks_left,
			rbld_buf.ldev_size);
}
+12 −12
Original line number Diff line number Diff line
@@ -950,9 +950,9 @@ static ssize_t raid_state_show(struct device *dev,

		name = myrs_devstate_name(ldev_info->dev_state);
		if (name)
			ret = snprintf(buf, 32, "%s\n", name);
			ret = snprintf(buf, 64, "%s\n", name);
		else
			ret = snprintf(buf, 32, "Invalid (%02X)\n",
			ret = snprintf(buf, 64, "Invalid (%02X)\n",
				       ldev_info->dev_state);
	} else {
		struct myrs_pdev_info *pdev_info;
@@ -961,9 +961,9 @@ static ssize_t raid_state_show(struct device *dev,
		pdev_info = sdev->hostdata;
		name = myrs_devstate_name(pdev_info->dev_state);
		if (name)
			ret = snprintf(buf, 32, "%s\n", name);
			ret = snprintf(buf, 64, "%s\n", name);
		else
			ret = snprintf(buf, 32, "Invalid (%02X)\n",
			ret = snprintf(buf, 64, "Invalid (%02X)\n",
				       pdev_info->dev_state);
	}
	return ret;
@@ -1069,13 +1069,13 @@ static ssize_t raid_level_show(struct device *dev,
		ldev_info = sdev->hostdata;
		name = myrs_raid_level_name(ldev_info->raid_level);
		if (!name)
			return snprintf(buf, 32, "Invalid (%02X)\n",
			return snprintf(buf, 64, "Invalid (%02X)\n",
					ldev_info->dev_state);

	} else
		name = myrs_raid_level_name(MYRS_RAID_PHYSICAL);

	return snprintf(buf, 32, "%s\n", name);
	return snprintf(buf, 64, "%s\n", name);
}
static DEVICE_ATTR_RO(raid_level);

@@ -1089,7 +1089,7 @@ static ssize_t rebuild_show(struct device *dev,
	unsigned char status;

	if (sdev->channel < cs->ctlr_info->physchan_present)
		return snprintf(buf, 32, "physical device - not rebuilding\n");
		return snprintf(buf, 64, "physical device - not rebuilding\n");

	ldev_info = sdev->hostdata;
	ldev_num = ldev_info->ldev_num;
@@ -1101,11 +1101,11 @@ static ssize_t rebuild_show(struct device *dev,
		return -EIO;
	}
	if (ldev_info->rbld_active) {
		return snprintf(buf, 32, "rebuilding block %zu of %zu\n",
		return snprintf(buf, 64, "rebuilding block %zu of %zu\n",
				(size_t)ldev_info->rbld_lba,
				(size_t)ldev_info->cfg_devsize);
	} else
		return snprintf(buf, 32, "not rebuilding\n");
		return snprintf(buf, 64, "not rebuilding\n");
}

static ssize_t rebuild_store(struct device *dev,
@@ -1194,7 +1194,7 @@ static ssize_t consistency_check_show(struct device *dev,
	unsigned char status;

	if (sdev->channel < cs->ctlr_info->physchan_present)
		return snprintf(buf, 32, "physical device - not checking\n");
		return snprintf(buf, 64, "physical device - not checking\n");

	ldev_info = sdev->hostdata;
	if (!ldev_info)
@@ -1202,11 +1202,11 @@ static ssize_t consistency_check_show(struct device *dev,
	ldev_num = ldev_info->ldev_num;
	status = myrs_get_ldev_info(cs, ldev_num, ldev_info);
	if (ldev_info->cc_active)
		return snprintf(buf, 32, "checking block %zu of %zu\n",
		return snprintf(buf, 64, "checking block %zu of %zu\n",
				(size_t)ldev_info->cc_lba,
				(size_t)ldev_info->cfg_devsize);
	else
		return snprintf(buf, 32, "not checking\n");
		return snprintf(buf, 64, "not checking\n");
}

static ssize_t consistency_check_store(struct device *dev,