Author: tkreuzer
Date: Sat Aug 20 21:20:33 2011
New Revision: 53348

URL: http://svn.reactos.org/svn/reactos?rev=53348&view=rev
Log:
[VFATLIB]
Fix completely non-standard, broken and retarded definition of GET_UNALIGNED_W 
for 64 bit architectures
The function is supposed to read an unaligned little endian USHORT value. The 
old version copied the 2 bytes with memcpy to an aligned stack variable and 
then (bug bug) read the unaligned value directly (discarding the result of the 
previous operation) and passed it to bswap if neccessary.
The new function simply reads the 2 bytes and combines them using << and |.

Modified:
    trunk/reactos/lib/fslib/vfatlib/check/boot.c

Modified: trunk/reactos/lib/fslib/vfatlib/check/boot.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/boot.c?rev=53348&r1=53347&r2=53348&view=diff
==============================================================================
--- trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] Sat Aug 20 
21:20:33 2011
@@ -30,18 +30,17 @@
     { 0xff, "5.25\" 320k floppy 2s/40tr/8sec" },
 };
 
-#if defined __alpha || defined __ia64__ || defined __s390x__ || defined 
__x86_64__ || defined __ppc64__
-/* Unaligned fields must first be copied byte-wise */
-#define GET_UNALIGNED_W(f)                     \
-    ({                                         \
-       unsigned short __v;                     \
-       memcpy( &__v, &f, sizeof(__v) );        \
-       CF_LE_W( *(unsigned short *)&f );       \
-    })
+#if defined __alpha || defined __ia64__ || defined __x86_64__ || defined 
__ppc64__
+/* Unaligned fields must first be copied byte-wise (little endian) */
+#define GET_UNALIGNED_W(u) \
+    (((unsigned char*)(&u))[0] | (((unsigned char*)&(u))[1] << 8))
+#elif defined __s390x__
+/* Unaligned fields must first be copied byte-wise (big endian) */
+#define GET_UNALIGNED_W(pu) \
+    (((unsigned char*)&(u))[1] | (((unsigned char*)&(u))[0] << 8))
 #else
 #define GET_UNALIGNED_W(f) CF_LE_W( *(unsigned short *)&f )
 #endif
-
 
 static char *get_media_descr( unsigned char media )
 {


Reply via email to