Hi all,

I think there is a bug when using the native protocol to link two instances of 
FlightGear via network or when recording and playing back flights using

fgfs --native=file,out,20,fgfs.out 

and

fgfs --native,file,in,20,fgfs.out --fdm=external

The "external" FlightGear crashes and after some investigation I think the 
problem is a missing operator =() method in FDM/flight.hxx

The problem is:
In Network/native.cxx a buffer is read either from network of from a file 
containing the previously written fdm state. The content of the buffer is 
than assigned to the current fdm state by doing
        *cur_fdm_state = buf;
both variables are of type FGInterface which currently lacks a operator =() 
method, so the compiler uses a simple memcpy to copy one object to the other.
This is almost ok but for the ground_cache object. This is a complex object 
containing a std::vector<FGGroundCache::Triangle>. This vector seems to store 
memory pointers to the Triangle-vertices. This is a very bad thing because 
these pointers are invalid for any other FlightGear session and dereferencing 
them causes a segmentation fault.

A very ugly - if not disgusting - workaround is adding the following to the 
public methods of FGInterface in FDM/flight.hxx:

    virtual const FGInterface & operator = ( FGInterface & src ) {
      char * start = (char*)&inited;
      char * end = (char*)&ground_cache;
      memcpy( &inited, &src.inited, end-start );
      prepare_ground_cache_m( 0, geodetic_position_v, 100.0 );
    }

This gets called instead of a memcpy when assinging one FGInterface to another 
and it does the memcpy for all member variables but the ground_cache. The 
ground_cache itself is initialized for the recovered position with a fix 
reference time of 0 and a radius of 100m.

At least this change fixes the segfault when replaying with the native 
protocol, but I don't think this is the kind of code we want to see in 
FlightGear for two reasons:

a) The pointer arithmetic assuming simple datatypes between the inited and 
ground_cache variable

b) A constant used for reference time and the radius.

While a) may be circumnavigated by using explicit assignments for all 
variables, I have no good idea for b). The radius might be saved when doing 
the output, but I do not understand the idea of the reference time...

And there is one thing that is going round in my head: Curt reported, that he 
does not have this problem at all and no one else (except tpalinkas) reported 
this crash. Maybe this a a compiler/library problem? 

Thanks for reading all that - any comment or help is appreciated.

Torsten

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to