Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 Jan 2010 17:43:22 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r203296 - stable/8/sys/fs/cd9660
Message-ID:  <201001311743.o0VHhMno093094@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Sun Jan 31 17:43:22 2010
New Revision: 203296
URL: http://svn.freebsd.org/changeset/base/203296

Log:
  MFC: r202903
  
  On LP64 struct ifid is 64-bit aligned while struct fid is 32-bit aligned
  so on architectures with strict alignment requirements we can't just simply
  cast the latter to the former but need to copy it bytewise instead.
  
  PR:		143010

Modified:
  stable/8/sys/fs/cd9660/cd9660_vfsops.c
  stable/8/sys/fs/cd9660/cd9660_vnops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- stable/8/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 17:17:24 2010	(r203295)
+++ stable/8/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 17:43:22 2010	(r203296)
@@ -589,17 +589,19 @@ cd9660_fhtovp(mp, fhp, vpp)
 	struct fid *fhp;
 	struct vnode **vpp;
 {
-	struct ifid *ifhp = (struct ifid *)fhp;
+	struct ifid ifh;
 	struct iso_node *ip;
 	struct vnode *nvp;
 	int error;
 
+	memcpy(&ifh, fhp, sizeof(ifh));
+
 #ifdef	ISOFS_DBG
 	printf("fhtovp: ino %d, start %ld\n",
-	       ifhp->ifid_ino, ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
 
-	if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
+	if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
 		*vpp = NULLVP;
 		return (error);
 	}

Modified: stable/8/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- stable/8/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 17:17:24 2010	(r203295)
+++ stable/8/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 17:43:22 2010	(r203296)
@@ -819,20 +819,25 @@ cd9660_vptofh(ap)
 		struct fid *a_fhp;
 	} */ *ap;
 {
+	struct ifid ifh;
 	struct iso_node *ip = VTOI(ap->a_vp);
-	struct ifid *ifhp;
 
-	ifhp = (struct ifid *)ap->a_fhp;
-	ifhp->ifid_len = sizeof(struct ifid);
+	ifh.ifid_len = sizeof(struct ifid);
 
-	ifhp->ifid_ino = ip->i_number;
-	ifhp->ifid_start = ip->iso_start;
+	ifh.ifid_ino = ip->i_number;
+	ifh.ifid_start = ip->iso_start;
+	/*
+	 * This intentionally uses sizeof(ifh) in order to not copy stack
+	 * garbage on ILP32.
+	 */
+	memcpy(ap->a_fhp, &ifh, sizeof(ifh));
 
 #ifdef	ISOFS_DBG
 	printf("vptofh: ino %d, start %ld\n",
-	       ifhp->ifid_ino,ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
-	return 0;
+
+	return (0);
 }
 
 /*



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