Bug#380404: amphetamine: segfaults at end of level (amd64)

Darren Salt linux at youmustbejoking.demon.co.uk
Sat Jul 29 22:53:53 UTC 2006


Package: amphetamine
Version: 0.8.10-10
Tags: patch

amphetamine (on amd64) segfaults on activation of a teleport object. The
cause is an assumption about the size of long and unsigned long.

-- 
| Darren Salt    | linux or ds at              | nr. Ashington, | Toon
| RISC OS, Linux | youmustbejoking,demon,co,uk | Northumberland | Army
| + Output less CO2 => avoid massive flooding.    TIME IS RUNNING OUT *FAST*.

Everybody should believe in something... I believe I'll have another drink.
-------------- next part --------------
--- amphetamine-0.8.10.orig/src/Shape.cpp
+++ amphetamine-0.8.10/src/Shape.cpp
@@ -56,12 +56,12 @@
  */
 #ifdef __OPT_MEM_ACCESS__
 
-#define GET_LONG(adr)		*(unsigned long *)adr
-#define SET_LONG(adr, l)	*(unsigned long *)adr = l
+#define GET_LONG(adr)		*(uint32_t *)adr
+#define SET_LONG(adr, l)	*(uint32_t *)adr = l
 
 #else
 
-#define GET_LONG(adr)	((long)((unsigned char *)(adr))[0] << 24) + ((long)((unsigned char *)(adr))[1] << 16) + ((long)((unsigned char *)(adr))[2] << 8) + ((long)((unsigned char *)(adr))[3])
+#define GET_LONG(adr)	((uint32_t)((unsigned char *)(adr))[0] << 24) + ((uint32_t)((unsigned char *)(adr))[1] << 16) + ((uint32_t)((unsigned char *)(adr))[2] << 8) + ((uint32_t)((unsigned char *)(adr))[3])
 #define SET_LONG(adr, l)	((unsigned char *)adr)[0] = (unsigned char)((l) >> 24); \
 	                        ((unsigned char *)adr)[1] = (unsigned char)((l) >> 16); \
 	                        ((unsigned char *)adr)[2] = (unsigned char)((l) >> 8); \
@@ -116,7 +116,7 @@
 		{
 			// store the location of this line start
 			lineStartPtr = destPtr;
-			destPtr += sizeof( unsigned long );
+			destPtr += sizeof( uint32_t );
 			
 			// at the beginning of each row we are not in any run
 			drawRunFlag = kFalse;
@@ -160,7 +160,7 @@
 									// create the skip token
 									//*( ( unsigned long * )destPtr ) = ( kSkipPixelsToken << 24 ) + runCounter;
 									SET_LONG(destPtr, ( kSkipPixelsToken << 24 ) + runCounter);
-									destPtr += sizeof( unsigned long );
+									destPtr += sizeof( uint32_t );
 								}
 							
 							// are we in a draw run
@@ -179,7 +179,7 @@
 									
 									// save the location of the token (so we can fill it in later)
 									runTokenPtr = destPtr;
-									destPtr += sizeof( unsigned long );
+									destPtr += sizeof( uint32_t );
 									
 									// copy the pixel
 									*destPtr = *srcPtr;
@@ -215,7 +215,7 @@
 	
 	// create the end of shape token
 	SET_LONG(destPtr, kEndShapeToken << 24);
-	destPtr += sizeof( unsigned long );
+	destPtr += sizeof( uint32_t );
 	
 	// Resize the handle to match the real size of the shape
 	//SetHandleSize( shapeHandle, destPtr - ( unsigned char * )( *shapeHandle ) );
@@ -280,7 +280,7 @@
 			// get a token
 			tokenOp = GET_LONG(srcPtr ) >> 24;
 			tokenData = GET_LONG(srcPtr ) & 0x00ffffff;
-			srcPtr += sizeof( unsigned long );
+			srcPtr += sizeof( uint32_t );
 			
 			// depending on the token
 			switch( tokenOp )
@@ -435,7 +435,7 @@
 			// get a token
 			tokenOp = GET_LONG(srcPtr) >> 24;
 			tokenData = GET_LONG(srcPtr) & 0x00ffffff;
-			srcPtr += sizeof( unsigned long );
+			srcPtr += sizeof( uint32_t );
 			
 			// depending on the token
 			switch( tokenOp )


More information about the Pkg-games-devel mailing list