From aa04760f806b4d3af68067fb33b5b3ac9d96ad4f Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 17 Feb 2025 12:23:49 +1000 Subject: [PATCH] [spatialite] Fix a bunch of leaks --- .../spatialite/qgsspatialiteprovider.cpp | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index 9189a73d978..4e3b34bae7e 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -792,6 +792,10 @@ void QgsSpatiaLiteProvider::loadFieldsAbstractInterface( gaiaVectorLayerPtr lyr mPrimaryKeyAttrs << i - 1; } } + else + { + sqlite3_free( errMsg ); + } // check for constraints fetchConstraints(); @@ -823,7 +827,8 @@ QString QgsSpatiaLiteProvider::spatialiteVersion() ret = sqlite3_get_table( mSqliteHandle, sql.toUtf8(), &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK || rows != 1 ) { - QgsMessageLog::logMessage( tr( "Retrieval of spatialite version failed" ), tr( "SpatiaLite" ) ); + QgsMessageLog::logMessage( tr( "Retrieval of spatialite version failed: %1" ).arg( QString( errMsg ) ), tr( "SpatiaLite" ) ); + sqlite3_free( errMsg ); return QString(); } @@ -1282,6 +1287,10 @@ void QgsSpatiaLiteProvider::determineViewPrimaryKey() } sqlite3_free_table( results ); } + else + { + sqlite3_free( errMsg ); + } } QStringList QgsSpatiaLiteProvider::tablePrimaryKeys( const QString &tableName ) const @@ -1337,6 +1346,11 @@ bool QgsSpatiaLiteProvider::hasTriggers() ret = sqlite3_get_table( sqliteHandle(), sql.toUtf8().constData(), &results, &rows, &columns, &errMsg ); sqlite3_free_table( results ); + if ( ret != SQLITE_OK ) + { + sqlite3_free( errMsg ); + } + return ( ret == SQLITE_OK && rows > 0 ); } @@ -6028,10 +6042,12 @@ bool QgsSpatiaLiteProviderMetadata::styleExists( const QString &uri, const QStri if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); - QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( countIfExist ) ); + QgsMessageLog::logMessage( QObject::tr( "Error executing query %1: %2" ).arg( countIfExist ).arg( QString( errMsg ) ) ); + sqlite3_free( errMsg ); errorCause = QObject::tr( "Error looking for style. The query was logged" ); return false; } + sqlite3_free_table( results ); if ( rows == 0 ) { // layer_styles table does not exist @@ -6058,6 +6074,7 @@ bool QgsSpatiaLiteProviderMetadata::styleExists( const QString &uri, const QStri sqlError = errMsg; sqlite3_free( errMsg ); } + sqlite3_free_table( results ); QgsSqliteHandle::closeDb( handle ); if ( SQLITE_OK != ret ) @@ -6099,7 +6116,8 @@ bool QgsSpatiaLiteProviderMetadata::saveStyle( const QString &uri, const QString if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); - QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( countIfExist ) ); + QgsMessageLog::logMessage( QObject::tr( "Error executing query %1: %2" ).arg( countIfExist ).arg( QString( errMsg ) ) ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error looking for style. The query was logged" ); return false; } @@ -6180,14 +6198,15 @@ bool QgsSpatiaLiteProviderMetadata::saveStyle( const QString &uri, const QString if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); - QgsMessageLog::logMessage( QObject::tr( "Error executing query: %1" ).arg( checkQuery ) ); + QgsMessageLog::logMessage( QObject::tr( "Error executing query %1: %2" ).arg( checkQuery ).arg( QString( errMsg ) ) ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error looking for style. The query was logged" ); return false; } + sqlite3_free_table( results ); if ( 0 != rows ) { - sqlite3_free_table( results ); sql = QString( "UPDATE layer_styles" " SET useAsDefault=%1" ",styleQML=%2" @@ -6290,6 +6309,7 @@ QString QgsSpatiaLiteProviderMetadata::loadStoredStyle( const QString &uri, QStr if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error executing loading style. The query was logged" ); return QString(); } @@ -6330,6 +6350,7 @@ int QgsSpatiaLiteProviderMetadata::listStyles( const QString &uri, QStringList & if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error looking for style. The query was logged" ); return -1; } @@ -6363,6 +6384,7 @@ int QgsSpatiaLiteProviderMetadata::listStyles( const QString &uri, QStringList & if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error loading styles. The query was logged" ); return -1; } @@ -6388,6 +6410,7 @@ int QgsSpatiaLiteProviderMetadata::listStyles( const QString &uri, QStringList & if ( SQLITE_OK != ret ) { QgsSqliteHandle::closeDb( handle ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error executing the select query for unrelated styles. The query was logged" ); return -1; } @@ -6438,6 +6461,7 @@ QString QgsSpatiaLiteProviderMetadata::getStyleById( const QString &uri, const Q else { QgsMessageLog::logMessage( QObject::tr( "Style with id %1 not found in %2 (Query: %3)" ).arg( styleId, sqlitePath, selectQmlQuery ) ); + sqlite3_free( errMsg ); errCause = QObject::tr( "Error executing the select query. The query was logged" ); }