From 125677111dfbbfc714cd99c0e6984a650a1f95a2 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Mon, 10 Mar 2025 14:19:55 +0000 Subject: [PATCH] Use sqlite3_errmsg() to avoid getting a mutable error message Fixes https://github.com/hughsie/colord/issues/182 --- src/cd-common.h | 3 -- src/cd-device-db.c | 47 ++++++++++++----------------- src/cd-mapping-db.c | 72 ++++++++++++++++++--------------------------- src/cd-profile-db.c | 28 +++++++----------- 4 files changed, 56 insertions(+), 94 deletions(-) diff --git a/src/cd-common.h b/src/cd-common.h index c60061ae..3d2f1826 100644 --- a/src/cd-common.h +++ b/src/cd-common.h @@ -38,9 +38,6 @@ #define CD_DBUS_METADATA_KEY_LEN_MAX 256 /* chars */ #define CD_DBUS_METADATA_VALUE_LEN_MAX 4096 /* chars */ -typedef char sqlite_str; -G_DEFINE_AUTOPTR_CLEANUP_FUNC (sqlite_str, sqlite3_free) - #define CD_CLIENT_ERROR cd_client_error_quark() GQuark cd_client_error_quark (void); diff --git a/src/cd-device-db.c b/src/cd-device-db.c index e97c8823..7762701f 100644 --- a/src/cd-device-db.c +++ b/src/cd-device-db.c @@ -48,7 +48,6 @@ cd_device_db_load (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); const gchar *statement; - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -79,9 +78,9 @@ cd_device_db_load (CdDeviceDb *ddb, /* check devices */ rc = sqlite3_exec (priv->db, "SELECT * FROM devices LIMIT 1", - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { - g_debug ("CdDeviceDb: creating table to repair: %s", error_msg); + g_debug ("CdDeviceDb: creating table to repair: %s", sqlite3_errmsg(priv->db)); statement = "CREATE TABLE devices (" "device_id TEXT PRIMARY KEY," "device TEXT);"; @@ -108,21 +107,19 @@ cd_device_db_empty (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); const gchar *statement; - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_DEVICE_DB (ddb), FALSE); g_return_val_if_fail (priv->db != NULL, FALSE); statement = "DELETE FROM devices;DELETE FROM properties_v2;"; - rc = sqlite3_exec (priv->db, statement, - NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } return TRUE; @@ -135,7 +132,6 @@ cd_device_db_add (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -148,13 +144,13 @@ cd_device_db_add (CdDeviceDb *ddb, device_id); /* insert the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -172,7 +168,6 @@ cd_device_db_set_property (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -186,13 +181,13 @@ cd_device_db_set_property (CdDeviceDb *ddb, device_id, property, value); /* insert the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -208,7 +203,6 @@ cd_device_db_remove (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - char *error_msg = NULL; gchar *statement1 = NULL; gchar *statement2 = NULL; gint rc; @@ -221,28 +215,26 @@ cd_device_db_remove (CdDeviceDb *ddb, statement1 = sqlite3_mprintf ("DELETE FROM devices WHERE " "device_id = '%q';", device_id); - rc = sqlite3_exec (priv->db, statement1, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement1, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); - sqlite3_free (error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } statement2 = sqlite3_mprintf ("DELETE FROM properties_v2 WHERE " "device_id = '%q';", device_id); - rc = sqlite3_exec (priv->db, statement2, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement2, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); - sqlite3_free (error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -273,7 +265,6 @@ cd_device_db_get_property (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; gchar *value = NULL; @@ -294,13 +285,13 @@ cd_device_db_get_property (CdDeviceDb *ddb, statement, cd_device_db_sqlite_cb, array_tmp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } @@ -326,7 +317,6 @@ cd_device_db_get_devices (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -343,13 +333,13 @@ cd_device_db_get_devices (CdDeviceDb *ddb, statement, cd_device_db_sqlite_cb, array_tmp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } @@ -366,7 +356,6 @@ cd_device_db_get_properties (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -385,13 +374,13 @@ cd_device_db_get_properties (CdDeviceDb *ddb, statement, cd_device_db_sqlite_cb, array_tmp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } diff --git a/src/cd-mapping-db.c b/src/cd-mapping-db.c index edf944c1..b778c6d0 100644 --- a/src/cd-mapping-db.c +++ b/src/cd-mapping-db.c @@ -67,7 +67,6 @@ cd_mapping_db_open (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -93,7 +92,7 @@ cd_mapping_db_open (CdMappingDb *mdb, } /* sanity check of the database */ - rc = sqlite3_exec (priv->db, "PRAGMA quick_check", NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, "PRAGMA quick_check", NULL, NULL, NULL); if (rc != SQLITE_OK) { /* Database appears to be mangled, so wipe it and try again */ sqlite3_close (priv->db); @@ -115,7 +114,7 @@ cd_mapping_db_open (CdMappingDb *mdb, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "Cannot open mapping database: %s", - error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } } @@ -130,7 +129,6 @@ cd_mapping_db_load (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); const gchar *statement; - char *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -142,22 +140,20 @@ cd_mapping_db_load (CdMappingDb *mdb, /* we don't need to keep doing fsync */ rc = sqlite3_exec (priv->db, "PRAGMA synchronous=OFF", - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "Failed to turn off synchronous operations: SQL error: %s", - error_msg); - sqlite3_free (error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } /* check mappings */ rc = sqlite3_exec (priv->db, "SELECT * FROM mappings LIMIT 1", - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { - g_debug ("CdMappingDb: creating table to repair: %s", error_msg); - sqlite3_free (error_msg); + g_debug ("CdMappingDb: creating table to repair: %s", sqlite3_errmsg(priv->db)); statement = "CREATE TABLE mappings (" "timestamp INTEGER DEFAULT 0," "device TEXT," @@ -168,20 +164,18 @@ cd_mapping_db_load (CdMappingDb *mdb, /* check mappings has timestamp (since 0.1.8) */ rc = sqlite3_exec (priv->db, "SELECT timestamp FROM mappings LIMIT 1", - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { - g_debug ("CdMappingDb: altering table to repair: %s", error_msg); - sqlite3_free (error_msg); + g_debug ("CdMappingDb: altering table to repair: %s", sqlite3_errmsg(priv->db)); statement = "ALTER TABLE mappings ADD COLUMN timestamp INTEGER DEFAULT 0;"; sqlite3_exec (priv->db, statement, NULL, NULL, NULL); } /* check mappings version 2 exists (since 0.1.29) */ rc = sqlite3_exec (priv->db, "SELECT * FROM mappings_v2 LIMIT 1", - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { - g_debug ("CdMappingDb: altering table to convert: %s", error_msg); - sqlite3_free (error_msg); + g_debug ("CdMappingDb: altering table to convert: %s", sqlite3_errmsg(priv->db)); statement = "CREATE TABLE mappings_v2 (" "timestamp INTEGER DEFAULT 0," "device TEXT," @@ -195,28 +189,26 @@ cd_mapping_db_load (CdMappingDb *mdb, statement, cd_mapping_db_convert_cb, mdb, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "Failed to migrate mappings: SQL error: %s", - error_msg); - sqlite3_free (error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } /* remove old table data */ statement = "DELETE FROM mappings;"; rc = sqlite3_exec (priv->db, statement, - NULL, NULL, &error_msg); + NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "Failed to migrate mappings: SQL error: %s", - error_msg); - sqlite3_free (error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } } @@ -229,21 +221,19 @@ cd_mapping_db_empty (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); const gchar *statement; - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_MAPPING_DB (mdb), FALSE); g_return_val_if_fail (priv->db != NULL, FALSE); statement = "DELETE FROM mappings_v2;"; - rc = sqlite3_exec (priv->db, statement, - NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } return TRUE; @@ -257,7 +247,6 @@ cd_mapping_db_add (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; gint64 timestamp; @@ -273,13 +262,13 @@ cd_mapping_db_add (CdMappingDb *mdb, device_id, profile_id, timestamp); /* insert the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -304,7 +293,6 @@ cd_mapping_db_clear_timestamp (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -318,13 +306,13 @@ cd_mapping_db_clear_timestamp (CdMappingDb *mdb, device_id, profile_id); /* update the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -347,7 +335,6 @@ cd_mapping_db_remove (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -360,13 +347,13 @@ cd_mapping_db_remove (CdMappingDb *mdb, device_id, profile_id); /* remove the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -401,7 +388,6 @@ cd_mapping_db_get_profiles (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -421,13 +407,13 @@ cd_mapping_db_get_profiles (CdMappingDb *mdb, statement, cd_mapping_db_sqlite_cb, array_tmp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } @@ -450,7 +436,6 @@ cd_mapping_db_get_devices (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -470,13 +455,13 @@ cd_mapping_db_get_devices (CdMappingDb *mdb, statement, cd_mapping_db_sqlite_cb, array_tmp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } @@ -515,7 +500,6 @@ cd_mapping_db_get_timestamp (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; guint64 timestamp = G_MAXUINT64; @@ -534,13 +518,13 @@ cd_mapping_db_get_timestamp (CdMappingDb *mdb, statement, cd_mapping_db_sqlite_timestamp_cb, ×tamp, - &error_msg); + NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } diff --git a/src/cd-profile-db.c b/src/cd-profile-db.c index 7d6b09a6..8a6b082e 100644 --- a/src/cd-profile-db.c +++ b/src/cd-profile-db.c @@ -48,7 +48,6 @@ cd_profile_db_load (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); const gchar *statement; - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -74,12 +73,10 @@ cd_profile_db_load (CdProfileDb *pdb, } /* we don't need to keep doing fsync */ - sqlite3_exec (priv->db, "PRAGMA synchronous=OFF", - NULL, NULL, NULL); + sqlite3_exec (priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL); /* check schema */ - rc = sqlite3_exec (priv->db, "SELECT * FROM properties_pu LIMIT 1", - NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, "SELECT * FROM properties_pu LIMIT 1", NULL, NULL, NULL); if (rc != SQLITE_OK) { statement = "CREATE TABLE properties_pu (" "profile_id TEXT," @@ -97,21 +94,19 @@ cd_profile_db_empty (CdProfileDb *pdb, GError **error) { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); const gchar *statement; - g_autoptr(sqlite_str) error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_PROFILE_DB (pdb), FALSE); g_return_val_if_fail (priv->db != NULL, FALSE); statement = "DELETE FROM properties_pu;"; - rc = sqlite3_exec (priv->db, statement, - NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); return FALSE; } return TRUE; @@ -127,7 +122,6 @@ cd_profile_db_set_property (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -142,13 +136,13 @@ cd_profile_db_set_property (CdProfileDb *pdb, profile_id, property, uid, value); /* insert the entry */ - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -166,7 +160,6 @@ cd_profile_db_remove (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement = NULL; gint rc; @@ -180,13 +173,13 @@ cd_profile_db_remove (CdProfileDb *pdb, "uid = '%i' AND " "property = '%q' LIMIT 1;", profile_id, uid, property); - rc = sqlite3_exec (priv->db, statement, NULL, NULL, &error_msg); + rc = sqlite3_exec (priv->db, statement, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); ret = FALSE; goto out; } @@ -219,7 +212,6 @@ cd_profile_db_get_property (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - g_autoptr(sqlite_str) error_msg = NULL; gchar *statement; gint rc; @@ -238,14 +230,14 @@ cd_profile_db_get_property (CdProfileDb *pdb, statement, cd_profile_db_sqlite_cb, value, - &error_msg); + NULL); if (rc != SQLITE_OK) { ret = FALSE; g_set_error (error, CD_CLIENT_ERROR, CD_CLIENT_ERROR_INTERNAL, "SQL error: %s", - error_msg); + sqlite3_errmsg(priv->db)); goto out; } out: