(svn r3948) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help). Backport of r3529, r3553 from trunk 0.4.5
authorDarkvater
Sat, 18 Mar 2006 15:12:24 +0000
branch0.4.5
changeset 9918 a151c4749c7a
parent 9917 c6b040b11814
child 9919 725dc9cbdf13
(svn r3948) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help). Backport of r3529, r3553 from trunk
gfx.c
macros.h
smallmap_gui.c
stdafx.h
strings.c
--- a/gfx.c	Fri Feb 03 17:24:37 2006 +0000
+++ b/gfx.c	Sat Mar 18 15:12:24 2006 +0000
@@ -698,7 +698,7 @@
 	const byte* ctab;
 
 	if (bp->mode & 1) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 
 		do {
 			do {
@@ -741,7 +741,7 @@
 			bp->dst += bp->pitch;
 		} while (--bp->height != 0);
 	} else if (bp->mode & 2) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		do {
 			do {
 				done = src_o[0];
@@ -775,7 +775,7 @@
 			bp->dst += bp->pitch;
 		} while (--bp->height != 0);
 	} else {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		do {
 			do {
 				done = src_o[0];
@@ -900,7 +900,7 @@
 	const byte* ctab;
 
 	if (bp->mode & 1) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		do {
 			do {
 				done = src_o[0];
@@ -949,7 +949,7 @@
 			} while (!(done & 0x80));
 		} while (--bp->height != 0);
 	} else if (bp->mode & 2) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		do {
 			do {
 				done = src_o[0];
@@ -994,7 +994,7 @@
 			} while (!(done & 0x80));
 		} while (--bp->height != 0);
 	} else {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		do {
 			do {
 				done = src_o[0];
@@ -1105,7 +1105,7 @@
 	const byte* ctab;
 
 	if (bp->mode & 1) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		for(;;) {
 			do {
 				done = src_o[0];
@@ -1174,7 +1174,7 @@
 			if (--bp->height == 0) return;
 		}
 	} else if (bp->mode & 2) {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		for(;;) {
 			do {
 				done = src_o[0];
@@ -1239,7 +1239,7 @@
 			if (--bp->height == 0) return;
 		}
 	} else {
-		src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
+		src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
 		for(;;) {
 			do {
 				done = src_o[0];
--- a/macros.h	Fri Feb 03 17:24:37 2006 +0000
+++ b/macros.h	Sat Mar 18 15:12:24 2006 +0000
@@ -142,14 +142,20 @@
 static inline void swap_tile(TileIndex *a, TileIndex *b) { TileIndex t = *a; *a = *b; *b = t; }
 
 
+static inline uint16 ReadLE16Aligned(const void* x)
+{
+	return FROM_LE16(*(const uint16*)x);
+}
 
-#if defined(TTD_LITTLE_ENDIAN)
-#	define READ_LE_UINT16(b) (*(const uint16*)(b))
-#elif defined(TTD_BIG_ENDIAN)
-	static inline uint16 READ_LE_UINT16(const void *b) {
-		return ((const byte*)b)[0] + (((const byte*)b)[1] << 8);
-	}
+static inline uint16 ReadLE16Unaligned(const void* x)
+{
+#ifdef OTTD_ALIGNMENT
+	return ((const byte*)x)[0] | ((const byte*)x)[1] << 8;
+#else
+	return FROM_LE16(*(const uint16*)x);
 #endif
+}
+
 
 /**
  * ROtate x Left/Right by n (must be >= 0)
--- a/smallmap_gui.c	Fri Feb 03 17:24:37 2006 +0000
+++ b/smallmap_gui.c	Sat Mar 18 15:12:24 2006 +0000
@@ -193,7 +193,7 @@
 	_legend_industries_candy,
 };
 
-#if defined(TTD_ALIGNMENT_4)
+#if defined(OTTD_ALIGNMENT)
 	static inline void WRITE_PIXELS(Pixel* d, uint32 val)
 	{
 #	if defined(TTD_BIG_ENDIAN)
--- a/stdafx.h	Fri Feb 03 17:24:37 2006 +0000
+++ b/stdafx.h	Sat Mar 18 15:12:24 2006 +0000
@@ -82,8 +82,6 @@
 # define CDECL
 # define NOT_REACHED() assert(0)
 # define GCC_PACK
-# undef TTD_ALIGNMENT_4
-# undef TTD_ALIGNMENT_2
 # include <malloc.h>
 #endif /* __WATCOMC__ */
 
@@ -133,8 +131,6 @@
 #  endif
 # endif /* _MSC_VER < 1300 */
 
-# undef TTD_ALIGNMENT_4
-# undef TTD_ALIGNMENT_2
 # define GCC_PACK
 
 // This is needed to zlib uses the stdcall calling convention on visual studio, also used with libpng (VS6 warning)
@@ -193,10 +189,13 @@
   typedef unsigned __int64 uint64;
 #endif /* __BEOS__ */
 
+#if defined(ARM) || defined(__arm__) || defined(__alpha__)
+# define OTTD_ALIGNMENT
+#endif
+
 // Setup alignment and conversion macros
 #if defined(TTD_BIG_ENDIAN)
-# define TTD_ALIGNMENT_2
-# define TTD_ALIGNMENT_4
+# define OTTD_ALIGNMENT
   static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); }
   static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); }
   static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); }
--- a/strings.c	Fri Feb 03 17:24:37 2006 +0000
+++ b/strings.c	Sat Mar 18 15:12:24 2006 +0000
@@ -499,6 +499,7 @@
 			break;
 
 		case 0x81: // {STRINL}
+			buff = GetStringWithArgs(buff, ReadLE16Unaligned(str), argv);
 			str += 2;
 			buff = GetStringWithArgs(buff, READ_LE_UINT16(str-2), argv);
 			break;
@@ -1013,7 +1014,7 @@
 
 #if defined(TTD_BIG_ENDIAN)
 	for (i = 0; i != 32; i++) {
-		lang_pack->offsets[i] = READ_LE_UINT16(&lang_pack->offsets[i]);
+		lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]);
 	}
 #endif