SCSI_IOCTL_GET_PCI can store up to 20 non-NUL characters, and it doesn't store a NUL character at all.
Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- src/include/scsi_ioctls.h | 6 +++++- src/lib/disk.c | 4 ++-- src/lib/scsi_ioctls.c | 17 ++++++++++++----- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/include/scsi_ioctls.h b/src/include/scsi_ioctls.h index 558824f..ba4c8bb 100644 --- a/src/include/scsi_ioctls.h +++ b/src/include/scsi_ioctls.h @@ -22,12 +22,16 @@ #define _SCSI_IOCTLS_H #include <stdint.h> +#include <stddef.h> /* Snagged from linux/include/scsi/scsi.h */ #define SCSI_IOCTL_GET_IDLUN 0x5382 #define SCSI_IOCTL_GET_PCI 0x5387 +/* see scsi_ioctl_get_pci() in linux/drivers/scsi/scsi_ioctl.c */ +#define SLOT_NAME_SIZE ((size_t)21) + typedef struct scsi_idlun { uint32_t dev_id; uint32_t host_unique_id; @@ -35,7 +39,7 @@ typedef struct scsi_idlun { inline int get_scsi_idlun(int fd, Scsi_Idlun *idlun); -inline int get_scsi_pci(int fd, char *slot_name); +int get_scsi_pci(int fd, char *slot_name, size_t size); int idlun_to_components (Scsi_Idlun *idlun, unsigned char *host, unsigned char *channel, diff --git a/src/lib/disk.c b/src/lib/disk.c index f592db6..c82ac80 100644 --- a/src/lib/disk.c +++ b/src/lib/disk.c @@ -209,7 +209,7 @@ disk_get_scsi_pci(int fd, { int rc, usefd=fd; struct stat buf; - char slot_name[8]; + char slot_name[SLOT_NAME_SIZE]; unsigned int b=0,d=0,f=0; memset(&buf, 0, sizeof(buf)); rc = fstat(fd, &buf); @@ -227,7 +227,7 @@ disk_get_scsi_pci(int fd, return 1; } - rc = get_scsi_pci(usefd, slot_name); + rc = get_scsi_pci(usefd, slot_name, sizeof slot_name); if (rc) { perror("get_scsi_pci"); return rc; diff --git a/src/lib/scsi_ioctls.c b/src/lib/scsi_ioctls.c index c19cef3..deb61bd 100644 --- a/src/lib/scsi_ioctls.c +++ b/src/lib/scsi_ioctls.c @@ -49,10 +49,17 @@ get_scsi_idlun(int fd, Scsi_Idlun *idlun) return ioctl(fd, SCSI_IOCTL_GET_IDLUN, idlun); } -inline int -get_scsi_pci(int fd, char *slot_name) +int +get_scsi_pci(int fd, char *slot_name, size_t size) { - return ioctl(fd, SCSI_IOCTL_GET_PCI, slot_name); + char buf[SLOT_NAME_SIZE] = ""; + int rc; + + rc = ioctl(fd, SCSI_IOCTL_GET_PCI, buf); + if (rc == 0) { + snprintf(slot_name, size, "%s", buf); + } + return rc; } @@ -68,7 +75,7 @@ usage(char **argv) int main(int argc, char **argv) { Scsi_Idlun idlun; - char slot_name[8]; + char slot_name[SLOT_NAME_SIZE] = "unknown"; int fd = 0, rc = 0; memset(&idlun, 0, sizeof(idlun)); @@ -81,7 +88,7 @@ int main(int argc, char **argv) exit(1); } - rc = get_scsi_pci(fd, slot_name); + rc = get_scsi_pci(fd, slot_name, sizeof slot_name); if (rc) { perror("Unable to get_scsi_pci()"); } -- 1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel