Skip to content

Commit d364770

Browse files
rouaultjef-n
authored andcommittedMar 23, 2016
[Spatialite] Use correct free function for sqlite3_bind_blob of geometries
Currently sqlite3_bind_blob() uses free() as the free function of WKB blobs returned by convertFromGeosWKB(). But those are allocated with new[] and should consequently be freed with delete[]. Spotted by Valgrind: ==4014== Mismatched free() / delete / delete [] ==4014== at 0x4C287BE: free (vg_replace_malloc.c:446) ==4014== by 0xE42E481: sqlite3VdbeMemReleaseExternal (sqlite3.c:57237) ==4014== by 0xE42E4E3: sqlite3VdbeMemRelease (sqlite3.c:57252) ==4014== by 0xE42EC3E: releaseMemArray (sqlite3.c:59208) ==4014== by 0xE42ED1E: sqlite3VdbeDeleteObject (sqlite3.c:60561) ==4014== by 0xE46A6DB: sqlite3VdbeFinalize (sqlite3.c:60528) ==4014== by 0xE46A916: sqlite3_finalize (sqlite3.c:61431) ==4014== by 0x7FB23958: QgsSpatiaLiteProvider::addFeatures(QList<QgsFeature>&) (qgsspatialiteprovider.cpp:3752) ==4014== Address 0x8e2a8b30 is 0 bytes inside a block of size 94 alloc'd ==4014== at 0x4C29520: operator new[](unsigned long) (vg_replace_malloc.c:363) ==4014== by 0x7FB1B964: QgsSpatiaLiteProvider::convertFromGeosWKB(unsigned char const*, int, unsigned char**, int*, int) (qgsspatialiteprovider.cpp:1341) ==4014== by 0x7FB234B5: QgsSpatiaLiteProvider::addFeatures(QList<QgsFeature>&) (qgsspatialiteprovider.cpp:3676) (cherry picked from commit 2e04162)
1 parent 0147765 commit d364770

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed
 

‎src/providers/spatialite/qgsspatialiteprovider.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3532,6 +3532,11 @@ QString QgsSpatiaLiteProvider::geomParam() const
35323532
return geometry;
35333533
}
35343534

3535+
static void deleteWkbBlob( void* wkbBlob )
3536+
{
3537+
delete[]( char* )wkbBlob;
3538+
}
3539+
35353540
bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList & flist )
35363541
{
35373542
sqlite3_stmt *stmt = NULL;
@@ -3615,7 +3620,7 @@ bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList & flist )
36153620
if ( !wkb )
36163621
sqlite3_bind_null( stmt, ++ia );
36173622
else
3618-
sqlite3_bind_blob( stmt, ++ia, wkb, wkb_size, free );
3623+
sqlite3_bind_blob( stmt, ++ia, wkb, wkb_size, deleteWkbBlob );
36193624
}
36203625
}
36213626

@@ -4005,7 +4010,7 @@ bool QgsSpatiaLiteProvider::changeGeometryValues( QgsGeometryMap & geometry_map
40054010
if ( !wkb )
40064011
sqlite3_bind_null( stmt, 1 );
40074012
else
4008-
sqlite3_bind_blob( stmt, 1, wkb, wkb_size, free );
4013+
sqlite3_bind_blob( stmt, 1, wkb, wkb_size, deleteWkbBlob );
40094014
sqlite3_bind_int64( stmt, 2, FID_TO_NUMBER( iter.key() ) );
40104015

40114016
// performing actual row update

0 commit comments

Comments
 (0)
Please sign in to comment.