Commit f7cf2242 authored by Heiko Carstens's avatar Heiko Carstens Committed by Jens Axboe
Browse files

s390/dasd: fix string length handling



Building dasd_eckd.o with latest clang reveals this bug:

    CC      drivers/s390/block/dasd_eckd.o
      drivers/s390/block/dasd_eckd.c:1082:3: warning: 'snprintf' will always be truncated;
      specified size is 1, but format string expands to at least 11 [-Wfortify-source]
       1082 |                 snprintf(print_uid, sizeof(*print_uid),
            |                 ^
      drivers/s390/block/dasd_eckd.c:1087:3: warning: 'snprintf' will always be truncated;
      specified size is 1, but format string expands to at least 10 [-Wfortify-source]
       1087 |                 snprintf(print_uid, sizeof(*print_uid),
            |                 ^

Fix this by moving and using the existing UID_STRLEN for the arrays
that are being written to. Also rename UID_STRLEN to DASD_UID_STRLEN
to clarify its scope.

Fixes: 23596961 ("s390/dasd: split up dasd_eckd_read_conf")
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com> # build
Reported-by: default avatarNathan Chancellor <nathan@kernel.org>
Closes: https://github.com/ClangBuiltLinux/linux/issues/1923


Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Link: https://lore.kernel.org/r/20230828153142.2843753-2-hca@linux.ibm.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1a721de8
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -1378,16 +1378,12 @@ static ssize_t dasd_vendor_show(struct device *dev,

static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL);

#define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial    */ 14 + 1 +\
		     /* SSID   */ 4 + 1 + /* unit addr */ 2 + 1 +\
		     /* vduit */ 32 + 1)

static ssize_t
dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	char uid_string[DASD_UID_STRLEN];
	struct dasd_device *device;
	struct dasd_uid uid;
	char uid_string[UID_STRLEN];
	char ua_string[3];

	device = dasd_device_from_cdev(to_ccwdev(dev));
+5 −5
Original line number Diff line number Diff line
@@ -1079,12 +1079,12 @@ static void dasd_eckd_get_uid_string(struct dasd_conf *conf,

	create_uid(conf, &uid);
	if (strlen(uid.vduit) > 0)
		snprintf(print_uid, sizeof(*print_uid),
		snprintf(print_uid, DASD_UID_STRLEN,
			 "%s.%s.%04x.%02x.%s",
			 uid.vendor, uid.serial, uid.ssid,
			 uid.real_unit_addr, uid.vduit);
	else
		snprintf(print_uid, sizeof(*print_uid),
		snprintf(print_uid, DASD_UID_STRLEN,
			 "%s.%s.%04x.%02x",
			 uid.vendor, uid.serial, uid.ssid,
			 uid.real_unit_addr);
@@ -1093,8 +1093,8 @@ static void dasd_eckd_get_uid_string(struct dasd_conf *conf,
static int dasd_eckd_check_cabling(struct dasd_device *device,
				   void *conf_data, __u8 lpm)
{
	char print_path_uid[DASD_UID_STRLEN], print_device_uid[DASD_UID_STRLEN];
	struct dasd_eckd_private *private = device->private;
	char print_path_uid[60], print_device_uid[60];
	struct dasd_conf path_conf;

	path_conf.data = conf_data;
@@ -1293,9 +1293,9 @@ static void dasd_eckd_path_available_action(struct dasd_device *device,
	__u8 path_rcd_buf[DASD_ECKD_RCD_DATA_SIZE];
	__u8 lpm, opm, npm, ppm, epm, hpfpm, cablepm;
	struct dasd_conf_data *conf_data;
	char print_uid[DASD_UID_STRLEN];
	struct dasd_conf path_conf;
	unsigned long flags;
	char print_uid[60];
	int rc, pos;

	opm = 0;
@@ -5855,8 +5855,8 @@ static void dasd_eckd_dump_sense(struct dasd_device *device,
static int dasd_eckd_reload_device(struct dasd_device *device)
{
	struct dasd_eckd_private *private = device->private;
	char print_uid[DASD_UID_STRLEN];
	int rc, old_base;
	char print_uid[60];
	struct dasd_uid uid;
	unsigned long flags;

+4 −0
Original line number Diff line number Diff line
@@ -259,6 +259,10 @@ struct dasd_uid {
	char vduit[33];
};

#define DASD_UID_STRLEN ( /* vendor */ 3 + 1 + /* serial    */ 14 + 1 +	\
			  /* SSID   */ 4 + 1 + /* unit addr */ 2 + 1 +	\
			  /* vduit */ 32 + 1)

/*
 * PPRC Status data
 */