----- "Andy Ross" a écrit :
> Frederic Bouvier wrote:
> > I get memory corruption caused by writing outside an malloc'ated
> memory
> > bloc. I tracked the problem down to the recsize() function ( in
> hash.c )
> > computing a memory size that is not enough for subsequent
> initialization
> > in resize()
> 
> Wow, good catch.  This was also reported on the nasal list as a
> difference
> between optimized and non-optimized builds on 32 bit linux.  I tracked
> it
> down as far as recsize() returning the wrong value, but then wrote it
> off
> as a compiler bug and didn't investigate further.  I missed the
> alignment
> issue completely.
> 
> Try the following patch, which will force the alignment but still
> allow the
> use of the (IMHO) clever trick to get the memory block size in a
> single line:

The patch you proposed doesn't solve the issue because void* has the 
same size than an int. As you want the data to be aligned on the 
size of a naRef, the modified patch below did the trick :

--- simgear/nasal/hash.c        26 Sep 2008 18:22:12 -0000      1.9
+++ simgear/nasal/hash.c        25 Nov 2008 19:55:47 -0000
@@ -96,9 +96,12 @@
 
 static int recsize(int lgsz)
 {
-    HashRec hr;
-    hr.lgsz = lgsz;
-    return (int)((char*)&TAB(&hr)[POW2(lgsz+1)] - (char*)&hr);
+    /* Union with the naRef for alignment purposes, to guarantee
+     * that the dummy HashRec has the same alignment as the malloc
+     * block that will eventually contain the real one. */
+    union { naRef align; HashRec hr; } u;
+    u.hr.lgsz = lgsz;
+    return (int)((char*)&TAB(&u.hr)[POW2(lgsz+1)] - (char*)&u.hr);
 }
 
 static HashRec* resize(struct naHash* hash)


-Fred


-- 
Frédéric Bouvier
http://my.fotolia.com/frfoto/              Photo gallery - album photo
http://fgsd.sourceforge.net/               FlightGear Scenery Designer


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to