Author: emaste
Date: Tue Jul 14 17:26:37 2009
New Revision: 195685
URL: http://svn.freebsd.org/changeset/base/195685

Log:
  Fix leaks in probestart, probedone, and scsi_scan_bus.  Also free
  page_list using the matching malloc type for the allocation.
  
  Approved by:  re
  Reviewed by:  scottl [1]
  MFC after:    1 week
  
  [1] Original patch was against xpt_cam.c, prior to the cam refactoring.

Modified:
  head/sys/cam/scsi/scsi_xpt.c

Modified: head/sys/cam/scsi/scsi_xpt.c
==============================================================================
--- head/sys/cam/scsi/scsi_xpt.c        Tue Jul 14 17:11:06 2009        
(r195684)
+++ head/sys/cam/scsi/scsi_xpt.c        Tue Jul 14 17:26:37 2009        
(r195685)
@@ -836,8 +836,11 @@ probestart(struct cam_periph *periph, un
 
                serial_buf = NULL;
                device = periph->path->device;
-               device->serial_num = NULL;
-               device->serial_num_len = 0;
+               if (device->serial_num != NULL) {
+                       free(device->serial_num, M_CAMXPT);
+                       device->serial_num = NULL;
+                       device->serial_num_len = 0;
+               }
 
                serial_buf = (struct scsi_vpd_unit_serial_number *)
                        malloc(sizeof(*serial_buf), M_CAMXPT, M_NOWAIT|M_ZERO);
@@ -1176,7 +1179,7 @@ probedone(struct cam_periph *periph, uni
                }
 
                if (page_list != NULL)
-                       free(page_list, M_DEVBUF);
+                       free(page_list, M_CAMXPT);
 
                if (serialnum_supported) {
                        xpt_release_ccb(done_ccb);
@@ -1561,6 +1564,7 @@ scsi_scan_bus(struct cam_periph *periph,
                        }
                        work_ccb = xpt_alloc_ccb_nowait();
                        if (work_ccb == NULL) {
+                               xpt_free_ccb((union ccb *)scan_info->cpi);
                                free(scan_info, M_CAMXPT);
                                xpt_free_path(path);
                                request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
@@ -1682,6 +1686,7 @@ scsi_scan_bus(struct cam_periph *periph,
                        }
 
                        if ((scan_info->cpi->hba_misc & PIM_SEQSCAN) == 0) {
+                               xpt_free_ccb(request_ccb);
                                break;
                        }
                        status = xpt_create_path(&path, xpt_periph,
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to