Author: marius
Date: Sun Mar 11 13:39:19 2012
New Revision: 232822
URL: http://svn.freebsd.org/changeset/base/232822

Log:
  Fix a bug introduced in r223938; on big-endian machines coping a 32-bit
  quantum bytewise to the address of a 64-bit variable results in writing
  to the "wrong" 32-bit half so adjust the address accordingly. This fix
  is implemented in a hackish way for two reasons:
  o in order to be able to get it into 8.3 with zero impact on the little-
    endian architectures where this bug has no effect and
  o to avoid blowing the x86 boot2 out of the water again when compiling
    it with clang, which all sane versions of this fix tested do.
  This change fixes booting from UFS1 file systems on big-endian machines.
  
  MFC after:    3 days

Modified:
  head/sys/boot/common/ufsread.c

Modified: head/sys/boot/common/ufsread.c
==============================================================================
--- head/sys/boot/common/ufsread.c      Sun Mar 11 12:19:58 2012        
(r232821)
+++ head/sys/boot/common/ufsread.c      Sun Mar 11 13:39:19 2012        
(r232822)
@@ -46,6 +46,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/endian.h>
+
 #include <ufs/ufs/dinode.h>
 #include <ufs/ufs/dir.h>
 #include <ufs/ffs/fs.h>
@@ -262,15 +264,28 @@ fsread(ino_t inode, void *buf, size_t nb
                        }
                        n = (lbn - NDADDR) & (n - 1);
 #if defined(UFS1_ONLY)
+#if BYTE_ORDER == BIG_ENDIAN
+                       memcpy((char *)&addr + sizeof(addr) -
+                           sizeof(ufs1_daddr_t), (ufs1_daddr_t *)indbuf + n,
+                           sizeof(ufs1_daddr_t));
+#else
                        memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
                            sizeof(ufs1_daddr_t));
+#endif
 #elif defined(UFS2_ONLY)
                        memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
                            sizeof(ufs2_daddr_t));
 #else
                        if (fs.fs_magic == FS_UFS1_MAGIC)
+#if BYTE_ORDER == BIG_ENDIAN
+                               memcpy((char *)&addr + sizeof(addr) -
+                                   sizeof(ufs1_daddr_t),
+                                   (ufs1_daddr_t *)indbuf + n,
+                               sizeof(ufs1_daddr_t));
+#else
                                memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
                                    sizeof(ufs1_daddr_t));
+#endif
                        else
                                memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
                                    sizeof(ufs2_daddr_t));
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to