OSDN Git Service

libata: transport: Use scnprintf() for avoiding potential buffer overflow
authorTakashi Iwai <tiwai@suse.de>
Wed, 11 Mar 2020 07:11:00 +0000 (08:11 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 12 Mar 2020 13:38:47 +0000 (07:38 -0600)
Since snprintf() returns the would-be-output size instead of the
actual output size, the succeeding calls may go beyond the given
buffer limit.  Fix it by replacing with scnprintf().

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/ata/libata-transport.c

index 12a505b..6a40e3c 100644 (file)
@@ -208,7 +208,7 @@ show_ata_port_##name(struct device *dev,                            \
 {                                                                      \
        struct ata_port *ap = transport_class_to_port(dev);             \
                                                                        \
-       return snprintf(buf, 20, format_string, cast ap->field);        \
+       return scnprintf(buf, 20, format_string, cast ap->field);       \
 }
 
 #define ata_port_simple_attr(field, name, format_string, type)         \
@@ -479,7 +479,7 @@ show_ata_dev_##field(struct device *dev,                            \
 {                                                                      \
        struct ata_device *ata_dev = transport_class_to_dev(dev);       \
                                                                        \
-       return snprintf(buf, 20, format_string, cast ata_dev->field);   \
+       return scnprintf(buf, 20, format_string, cast ata_dev->field);  \
 }
 
 #define ata_dev_simple_attr(field, format_string, type)        \
@@ -533,7 +533,7 @@ show_ata_dev_id(struct device *dev,
        if (ata_dev->class == ATA_DEV_PMP)
                return 0;
        for(i=0;i<ATA_ID_WORDS;i++)  {
-               written += snprintf(buf+written, 20, "%04x%c",
+               written += scnprintf(buf+written, 20, "%04x%c",
                                    ata_dev->id[i],
                                    ((i+1) & 7) ? ' ' : '\n');
        }
@@ -552,7 +552,7 @@ show_ata_dev_gscr(struct device *dev,
        if (ata_dev->class != ATA_DEV_PMP)
                return 0;
        for(i=0;i<SATA_PMP_GSCR_DWORDS;i++)  {
-               written += snprintf(buf+written, 20, "%08x%c",
+               written += scnprintf(buf+written, 20, "%08x%c",
                                    ata_dev->gscr[i],
                                    ((i+1) & 3) ? ' ' : '\n');
        }
@@ -581,7 +581,7 @@ show_ata_dev_trim(struct device *dev,
        else
                mode = "unqueued";
 
-       return snprintf(buf, 20, "%s\n", mode);
+       return scnprintf(buf, 20, "%s\n", mode);
 }
 
 static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);