Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jul 2009 17:42:53 +0000 (UTC)
From:      Scott Long <scottl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r195573 - head/sbin/camcontrol
Message-ID:  <200907101742.n6AHgrvQ027295@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: scottl
Date: Fri Jul 10 17:42:53 2009
New Revision: 195573
URL: http://svn.freebsd.org/changeset/base/195573

Log:
  Fix alignment issue with ATA IDENTIFY structure.
  
  Approved by:	re

Modified:
  head/sbin/camcontrol/camcontrol.c

Modified: head/sbin/camcontrol/camcontrol.c
==============================================================================
--- head/sbin/camcontrol/camcontrol.c	Fri Jul 10 17:22:41 2009	(r195572)
+++ head/sbin/camcontrol/camcontrol.c	Fri Jul 10 17:42:53 2009	(r195573)
@@ -1121,7 +1121,7 @@ ataidentify(struct cam_device *device, i
 {
 	union ccb *ccb;
 	struct ata_params *ident_buf;
-	int error = 0;
+	u_int i, error = 0;
 	int16_t *ptr;
 	
 	ccb = cam_getccb(device);
@@ -1135,22 +1135,21 @@ ataidentify(struct cam_device *device, i
 	bzero(&(&ccb->ccb_h)[1],
 	      sizeof(struct ccb_ataio) - sizeof(struct ccb_hdr));
 
-	ident_buf = (struct ata_params *)malloc(
-		sizeof(struct ata_params));
+	ptr = (uint16_t *)malloc(sizeof(struct ata_params));
 
-	if (ident_buf == NULL) {
+	if (ptr == NULL) {
 		cam_freeccb(ccb);
 		warnx("can't malloc memory for identify\n");
 		return(1);
 	}
-	bzero(ident_buf, sizeof(*ident_buf));
+	bzero(ptr, sizeof(struct ata_params));
 
 	cam_fill_ataio(&ccb->ataio,
 		      retry_count,
 		      NULL,
 		      /*flags*/CAM_DIR_IN,
 		      MSG_SIMPLE_Q_TAG,
-		      /*data_ptr*/(u_int8_t *)ident_buf,
+		      /*data_ptr*/(u_int8_t *)ptr,
 		      /*dxfer_len*/sizeof(struct ata_params),
 		      timeout ? timeout : 30 * 1000);
 //	if (periph->path->device->protocol == PROTO_ATA)
@@ -1172,6 +1171,7 @@ ataidentify(struct cam_device *device, i
 					CAM_EPF_ALL, stderr);
 		}
 
+		free(ptr);
 		cam_freeccb(ccb);
 		return(1);
 	}
@@ -1188,14 +1188,14 @@ ataidentify(struct cam_device *device, i
 	cam_freeccb(ccb);
 
 	if (error != 0) {
-		free(ident_buf);
+		free(ptr);
 		return(error);
 	}
 
-	for (ptr = (int16_t *)ident_buf;
-	     ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) {
-		*ptr = le16toh(*ptr);
-	}
+	for (i = 0; i < sizeof(struct ata_params) / 2; i++)
+		ptr[i] = le16toh(ptr[i]);
+	ident_buf = (struct ata_params *)ptr;
+
 	if (strncmp(ident_buf->model, "FX", 2) &&
 	    strncmp(ident_buf->model, "NEC", 3) &&
 	    strncmp(ident_buf->model, "Pioneer", 7) &&



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