]> git.itanic.dy.fi Git - linux-stable/commitdiff
s390/dasd: fix string length handling
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 28 Aug 2023 15:31:42 +0000 (17:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:53:56 +0000 (09:53 +0200)
commit f7cf22424665043787a96a66a048ff6b2cfd473c upstream.

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: 23596961b437 ("s390/dasd: split up dasd_eckd_read_conf")
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com> # build
Reported-by: Nathan Chancellor <nathan@kernel.org>
Closes: https://github.com/ClangBuiltLinux/linux/issues/1923
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Link: https://lore.kernel.org/r/20230828153142.2843753-2-hca@linux.ibm.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/s390/block/dasd_devmap.c
drivers/s390/block/dasd_eckd.c
drivers/s390/block/dasd_int.h

index 620fab01b710b9d89f9d2ba97d7dd7cfd765deaa..c4e36650c42649ff28150ca2d24f93c659758794 100644 (file)
@@ -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));
index 8587e423169ecd2bfc01acc61119ef600cc4a83d..bd89b032968a4b747c64f5e1e9c95b799fab8d22 100644 (file)
@@ -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;
 
index 0aa56351da720ebf8807a581ba9bd1d08b1a0a2b..8a4dbe9d774113836da6dc646a8f00ebac9ea910 100644 (file)
@@ -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
  */