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;
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to