libata: transport: Use scnprintf() for avoiding potential buffer overflow
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>
This commit is contained in:
parent
2c523b344d
commit
a900cc5cd8
|
@ -208,7 +208,7 @@ show_ata_port_##name(struct device *dev, \
|
||||||
{ \
|
{ \
|
||||||
struct ata_port *ap = transport_class_to_port(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) \
|
#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); \
|
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) \
|
#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)
|
if (ata_dev->class == ATA_DEV_PMP)
|
||||||
return 0;
|
return 0;
|
||||||
for(i=0;i<ATA_ID_WORDS;i++) {
|
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],
|
ata_dev->id[i],
|
||||||
((i+1) & 7) ? ' ' : '\n');
|
((i+1) & 7) ? ' ' : '\n');
|
||||||
}
|
}
|
||||||
|
@ -552,7 +552,7 @@ show_ata_dev_gscr(struct device *dev,
|
||||||
if (ata_dev->class != ATA_DEV_PMP)
|
if (ata_dev->class != ATA_DEV_PMP)
|
||||||
return 0;
|
return 0;
|
||||||
for(i=0;i<SATA_PMP_GSCR_DWORDS;i++) {
|
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],
|
ata_dev->gscr[i],
|
||||||
((i+1) & 3) ? ' ' : '\n');
|
((i+1) & 3) ? ' ' : '\n');
|
||||||
}
|
}
|
||||||
|
@ -581,7 +581,7 @@ show_ata_dev_trim(struct device *dev,
|
||||||
else
|
else
|
||||||
mode = "unqueued";
|
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);
|
static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);
|
||||||
|
|
Loading…
Reference in New Issue