summaryrefslogtreecommitdiffstats
path: root/sys/fs/cd9660
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2010-01-23 22:38:01 +0000
committermarius <marius@FreeBSD.org>2010-01-23 22:38:01 +0000
commit6d095a5fb75b8d5cc84a200521db2b498a80b0ea (patch)
treef1c9bcea08d81a63329a59f26e860f0602a73135 /sys/fs/cd9660
parentaa7c04ce461184acdfe00f51c04e5e1834dd6601 (diff)
downloadFreeBSD-src-6d095a5fb75b8d5cc84a200521db2b498a80b0ea.zip
FreeBSD-src-6d095a5fb75b8d5cc84a200521db2b498a80b0ea.tar.gz
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 MFC after: 3 days
Diffstat (limited to 'sys/fs/cd9660')
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c8
-rw-r--r--sys/fs/cd9660/cd9660_vnops.c19
2 files changed, 17 insertions, 10 deletions
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index b4c65e1..e27daf8 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/cd9660/cd9660_vfsops.c
@@ -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);
}
diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c
index 55ea46b..5f4780f 100644
--- a/sys/fs/cd9660/cd9660_vnops.c
+++ b/sys/fs/cd9660/cd9660_vnops.c
@@ -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);
}
/*
OpenPOWER on IntegriCloud