[ros-diffs] [tkreuzer] 53348: [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 USHOR...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat Aug 20 21:20:34 UTC 2011


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 )
 {




More information about the Ros-diffs mailing list