qgsrendererv2.cpp.patch

Patch to fix address alignment problem in qgsrendererv2.cpp - Sam Gillingham, 2011-11-09 01:26 PM

Download (3.73 KB)

View differences:

src/core/symbology-ng/qgsrendererv2.cpp 2011-11-09 16:23:50.943615000 +1300
23 23
unsigned char* QgsFeatureRendererV2::_getPoint( QPointF& pt, QgsRenderContext& context, unsigned char* wkb )
24 24
{
25 25
  wkb++; // jump over endian info
26
  unsigned int wkbType = *(( int* ) wkb );
26
  unsigned int wkbType;
27
  memcpy( &wkbType, wkb, sizeof( wkbType ) );
27 28
  wkb += sizeof( unsigned int );
28 29

  
29
  double x = *(( double * ) wkb ); wkb += sizeof( double );
30
  double y = *(( double * ) wkb ); wkb += sizeof( double );
30
  double x;
31
  memcpy( &x, wkb, sizeof( x ) );
32
  wkb += sizeof( double );
33
  double y;
34
  memcpy( &y, wkb, sizeof( y ));
35
  wkb += sizeof( double );
31 36

  
32 37
  if ( wkbType == QGis::WKBPolygon25D )
33 38
    wkb += sizeof( double );
......
47 52
unsigned char* QgsFeatureRendererV2::_getLineString( QPolygonF& pts, QgsRenderContext& context, unsigned char* wkb )
48 53
{
49 54
  wkb++; // jump over endian info
50
  unsigned int wkbType = *(( int* ) wkb );
55
  unsigned int wkbType;
56
  memcpy( &wkbType, wkb, sizeof( wkbType ) );
51 57
  wkb += sizeof( unsigned int );
52
  unsigned int nPoints = *(( int* ) wkb );
58
  unsigned int nPoints;
59
  memcpy( &nPoints, wkb, sizeof( nPoints ) );
53 60
  wkb += sizeof( unsigned int );
54 61

  
55 62
  bool hasZValue = ( wkbType == QGis::WKBLineString25D );
......
72 79

  
73 80
    for ( unsigned int i = 0; i < nPoints; ++i )
74 81
    {
75
      x = *(( double * ) wkb );
82
      memcpy( &x, wkb, sizeof( x ) );
76 83
      wkb += sizeof( double );
77
      y = *(( double * ) wkb );
84
      memcpy( &y, wkb, sizeof( y ) );
78 85
      wkb += sizeof( double );
79 86

  
80 87
      if ( hasZValue ) // ignore Z value
......
102 109
unsigned char* QgsFeatureRendererV2::_getPolygon( QPolygonF& pts, QList<QPolygonF>& holes, QgsRenderContext& context, unsigned char* wkb )
103 110
{
104 111
  wkb++; // jump over endian info
105
  unsigned int wkbType = *(( int* ) wkb );
112
  unsigned int wkbType;
113
  memcpy( &wkbType, wkb, sizeof( wkbType ) );
106 114
  wkb += sizeof( unsigned int ); // jump over wkb type
107
  unsigned int numRings = *(( int* ) wkb );
115
  unsigned int numRings;
116
  memcpy( &numRings, wkb, sizeof( numRings ) );
108 117
  wkb += sizeof( unsigned int );
109 118

  
110 119
  if ( numRings == 0 )  // sanity check for zero rings in polygon
......
124 133

  
125 134
  for ( unsigned int idx = 0; idx < numRings; idx++ )
126 135
  {
127
    unsigned int nPoints = *(( int* )wkb );
136
    unsigned int nPoints;
137
    memcpy( &nPoints, wkb, sizeof( nPoints ) );
128 138
    wkb += sizeof( unsigned int );
129 139

  
130 140
    QPolygonF poly( nPoints );
......
132 142
    // Extract the points from the WKB and store in a pair of vectors.
133 143
    for ( unsigned int jdx = 0; jdx < nPoints; jdx++ )
134 144
    {
135
      x = *(( double * ) wkb ); wkb += sizeof( double );
136
      y = *(( double * ) wkb ); wkb += sizeof( double );
145
      memcpy( &x, wkb, sizeof( x ) );
146
      wkb += sizeof( double );
147
      memcpy( &y, wkb, sizeof( y ) );
148
      wkb += sizeof( double );
137 149

  
138 150
      poly[jdx] = QPointF( x, y );
139 151

  
......
254 266
      }
255 267

  
256 268
      unsigned char* wkb = geom->asWkb();
257
      unsigned int num = *(( int* )( wkb + 5 ) );
269
      unsigned int num;
270
      memcpy( &num, wkb + 5, sizeof( num ) );
258 271
      unsigned char* ptr = wkb + 9;
259 272
      QPointF pt;
260 273

  
......
279 292
      }
280 293

  
281 294
      unsigned char* wkb = geom->asWkb();
282
      unsigned int num = *(( int* )( wkb + 5 ) );
295
      unsigned int num;
296
      memcpy( &num, wkb + 5, sizeof( num ) );
283 297
      unsigned char* ptr = wkb + 9;
284 298
      QPolygonF pts;
285 299

  
......
304 318
      }
305 319

  
306 320
      unsigned char* wkb = geom->asWkb();
307
      unsigned int num = *(( int* )( wkb + 5 ) );
321
      unsigned int num;
322
      memcpy( &num, wkb + 5, sizeof( num ) );
308 323
      unsigned char* ptr = wkb + 9;
309 324
      QPolygonF pts;
310 325
      QList<QPolygonF> holes;