imsm: fix: prevent segfault in mark_failure

Using an array of chars without the terminating null byte
as a parameter of sprintf() function causes segfault
when dealing with SAS drives (with 20-digits serial number).
The memcpy() function is used instead.

Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Lukasz Dorau 2011-10-19 11:51:48 +02:00 committed by NeilBrown
parent fde139b91e
commit 7d0c5e24a5
1 changed files with 3 additions and 1 deletions

View File

@ -6015,7 +6015,9 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
if (is_failed(disk) && (ord & IMSM_ORD_REBUILD))
return 0;
sprintf(buf, "%s:0", disk->serial);
memcpy(buf, disk->serial, MAX_RAID_SERIAL_LEN);
buf[MAX_RAID_SERIAL_LEN] = '\000';
strcat(buf, ":0");
if ((len = strlen(buf)) >= MAX_RAID_SERIAL_LEN)
shift = len - MAX_RAID_SERIAL_LEN + 1;
strncpy((char *)disk->serial, &buf[shift], MAX_RAID_SERIAL_LEN);