Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Apr 2017 16:07:31 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r317374 - stable/11/sbin/camcontrol
Message-ID:  <201704241607.v3OG7Vnk050843@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Mon Apr 24 16:07:30 2017
New Revision: 317374
URL: https://svnweb.freebsd.org/changeset/base/317374

Log:
  MFC r312558:
  
  Misc Coverity fixes in camcontrol(8)
  
  CID 1229913	Fix output of "camcontrol persist -i report_capabilities".
  		The reported Persistent Reservation Types were wrong in all
  		cases.
  CID 1356029	Annotate the code so Coverity will know that this is a false
  		positive.
  CID 1366830	Fix a memory leak in "camcontrol timestamp -s"
  CID 1366832	Fix a segfault that could be caused by bad drive firmware
  
  Also, fix the man page entry for the "camcontrol epc state" command to match
  what the code does.
  
  Reviewed by:	ken, wblock
  MFC after:	4 weeks
  Sponsored by:	Spectra Logic Corp
  Differential Revision:	https://reviews.freebsd.org/D9239

Modified:
  stable/11/sbin/camcontrol/camcontrol.8
  stable/11/sbin/camcontrol/epc.c
  stable/11/sbin/camcontrol/persist.c
  stable/11/sbin/camcontrol/timestamp.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/camcontrol/camcontrol.8
==============================================================================
--- stable/11/sbin/camcontrol/camcontrol.8	Mon Apr 24 15:29:17 2017	(r317373)
+++ stable/11/sbin/camcontrol/camcontrol.8	Mon Apr 24 16:07:30 2017	(r317374)
@@ -2385,6 +2385,20 @@ this power condition will be affected.
 .It state
 Enable or disable a particular power condition.
 .Bl -tag -width 7n
+.It Fl e
+Enable the power condition.
+One of 
+.Fl e
+or
+.Fl d
+is required.
+.It Fl d
+Disable the power condition.
+One of
+.Fl d
+or
+.Fl e
+is required.
 .It Fl p Ar cond
 Specify the power condition: Idle_a, Idle_b, Idle_c, Standby_y, Standby_z.
 This argument is required.

Modified: stable/11/sbin/camcontrol/epc.c
==============================================================================
--- stable/11/sbin/camcontrol/epc.c	Mon Apr 24 15:29:17 2017	(r317373)
+++ stable/11/sbin/camcontrol/epc.c	Mon Apr 24 16:07:30 2017	(r317374)
@@ -783,6 +783,7 @@ epc(struct cam_device *device, int argc,
 			warnx("Must specify a timer value (-T time)");
 			error = 1;
 		}
+		/* FALLTHROUGH */
 	case ATA_SF_EPC_SET_STATE:
 		if (enable == -1) {
 			warnx("Must specify enable (-e) or disable (-d)");

Modified: stable/11/sbin/camcontrol/persist.c
==============================================================================
--- stable/11/sbin/camcontrol/persist.c	Mon Apr 24 15:29:17 2017	(r317373)
+++ stable/11/sbin/camcontrol/persist.c	Mon Apr 24 16:07:30 2017	(r317374)
@@ -241,9 +241,11 @@ persist_print_cap(struct scsi_per_res_ca
 {
 	uint32_t length;
 	int check_type_mask = 0;
+	uint32_t type_mask;
 
 	length = scsi_2btoul(cap->length);
 	length = MIN(length, valid_len);
+	type_mask = scsi_2btoul(cap->type_mask);
 
 	if (length < __offsetof(struct scsi_per_res_cap, type_mask)) {
 		fprintf(stdout, "Insufficient data (%u bytes) to report "
@@ -345,20 +347,20 @@ persist_print_cap(struct scsi_per_res_ca
 		fprintf(stdout, "Supported Persistent Reservation Types:\n");
 		fprintf(stdout, "    Write Exclusive - All Registrants "
 			"(WR_EX_AR): %d\n",
-			(cap->type_mask[0] & SPRI_TM_WR_EX_AR)? 1 : 0);
+			(type_mask & SPRI_TM_WR_EX_AR)? 1 : 0);
 		fprintf(stdout, "    Exclusive Access - Registrants Only "
 			"(EX_AC_RO): %d\n",
-			(cap->type_mask[0] & SPRI_TM_EX_AC_RO) ? 1 : 0);
+			(type_mask & SPRI_TM_EX_AC_RO) ? 1 : 0);
 		fprintf(stdout, "    Write Exclusive - Registrants Only "
 			"(WR_EX_RO): %d\n",
-			(cap->type_mask[0] & SPRI_TM_WR_EX_RO)? 1 : 0);
+			(type_mask & SPRI_TM_WR_EX_RO)? 1 : 0);
 		fprintf(stdout, "    Exclusive Access (EX_AC): %d\n",
-			(cap->type_mask[0] & SPRI_TM_EX_AC) ? 1 : 0);
+			(type_mask & SPRI_TM_EX_AC) ? 1 : 0);
 		fprintf(stdout, "    Write Exclusive (WR_EX): %d\n",
-			(cap->type_mask[0] & SPRI_TM_WR_EX) ? 1 : 0);
+			(type_mask & SPRI_TM_WR_EX) ? 1 : 0);
 		fprintf(stdout, "    Exclusive Access - All Registrants "
 			"(EX_AC_AR): %d\n",
-			(cap->type_mask[1] & SPRI_TM_EX_AC_AR) ? 1 : 0);
+			(type_mask & SPRI_TM_EX_AC_AR) ? 1 : 0);
 	} else {
 		fprintf(stdout, "Persistent Reservation Type Mask is NOT "
 			"valid\n");

Modified: stable/11/sbin/camcontrol/timestamp.c
==============================================================================
--- stable/11/sbin/camcontrol/timestamp.c	Mon Apr 24 15:29:17 2017	(r317373)
+++ stable/11/sbin/camcontrol/timestamp.c	Mon Apr 24 16:07:30 2017	(r317374)
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -139,6 +140,8 @@ set_restore_flags(struct cam_device *dev
 	 * Create the control page at the correct point in the mode_buf, it
 	 * starts after the header and the blk description.
 	 */
+	assert(hdr_and_blk_length <=
+	    sizeof(mode_buf) - sizeof(struct scsi_control_ext_page));
 	control_page = (struct scsi_control_ext_page *)&mode_buf
 	    [hdr_and_blk_length];
 	if (set_flag != 0) {
@@ -241,6 +244,7 @@ report_timestamp(struct cam_device *devi
 bailout:
 	if (ccb != NULL)
 		cam_freeccb(ccb);
+	free(report_buf);
 
 	return error;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704241607.v3OG7Vnk050843>