changeset 24452:4afdede50c0c

12160 libdiskstatus: argument to 'alloca' may be too large Reviewed by: C Fraire <cfraire@me.com> Approved by: Dan McDonald <danmcd@joyent.com>
author Toomas Soome <tsoome@me.com>
date Sat, 04 Jan 2020 20:16:42 +0200
parents cbea130ad8f1
children 26e87d5dd27f 22899952daac
files usr/src/lib/fm/libdiskstatus/common/ds_scsi_uscsi.c
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/fm/libdiskstatus/common/ds_scsi_uscsi.c	Thu Nov 22 12:01:51 2018 +0200
+++ b/usr/src/lib/fm/libdiskstatus/common/ds_scsi_uscsi.c	Sat Jan 04 20:16:42 2020 +0200
@@ -1615,12 +1615,13 @@
 	if (page_size < sizeof (scsi_log_header_t))
 		return (-1);
 
-	log_sense_buf = alloca((uint_t)page_size);
+	log_sense_buf = calloc(1, page_size);
+	if (log_sense_buf == NULL)
+		return (-1);
 
 	/*
 	 * Build and execute the uscsi ioctl
 	 */
-	(void) memset(log_sense_buf, 0, page_size);
 	(void) memset((char *)&ucmd, 0, sizeof (ucmd));
 	(void) memset((char *)&cdb, 0, sizeof (union scsi_cdb));
 	cdb.scc_cmd = SCMD_LOG_SENSE_G1;
@@ -1633,6 +1634,7 @@
 	status = uscsi_cmd(fd, &ucmd, rqbuf, rqblen);
 	if (status) {
 		dprintf("Log sense page 0x%x failed\n", page_code);
+		free(log_sense_buf);
 		return (-1);
 	}
 
@@ -1651,6 +1653,7 @@
 		dprintf("\nLog sense page 0x%x: incorrect page code 0x%x\n",
 		    page_code, hdr->lh_code);
 		ddump("Log sense:", log_sense_buf, page_size);
+		free(log_sense_buf);
 		return (-1);
 	}
 
@@ -1672,6 +1675,7 @@
 	    sizeof (scsi_log_header_t));
 	ddump("data:", (caddr_t)hdr +
 	    sizeof (scsi_log_header_t), len);
+	free(log_sense_buf);
 
 	return (0);
 }