Submitted By: Xi Ruoyao Date: 2024-05-04 Initial Package Version: 1.4.7 Upstream Status: Committed Origin: Upstream (PR 168 and commit for issue 166) Description: Fix a misuse of sqlite API causing test failure with recent sqlite releases and an over-strict systemd hardening setting causing the systemd service fail to start. From 10fe2a07e31b5b151e7d46087b6b4155d2c680e1 Mon Sep 17 00:00:00 2001 From: psykose Date: Thu, 8 Feb 2024 12:10:45 +0000 Subject: [PATCH 1/2] fix NULL passed to free with sqlite3 error_msg pointers when an error does not happen, and an error_msg pointer is passed, sqlite does not touch it. that means this pointer is uninitialised (=NULL) which violates the constraints of g_autofree ("the variable must be initialized"). this is then passed to g_free and crashes in tests. use a regular pointer and free it manually on error, after sqlite writes to it after setting it with sqlite_malloc. fixes https://github.com/hughsie/colord/issues/163 --- src/cd-mapping-db.c | 3 ++- src/cd-profile-db.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cd-mapping-db.c b/src/cd-mapping-db.c index 996f07e3..5ffd74dd 100644 --- a/src/cd-mapping-db.c +++ b/src/cd-mapping-db.c @@ -67,7 +67,7 @@ cd_mapping_db_open (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - g_autofree gchar *error_msg = NULL; + gchar *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -97,6 +97,7 @@ cd_mapping_db_open (CdMappingDb *mdb, if (rc != SQLITE_OK) { /* Database appears to be mangled, so wipe it and try again */ sqlite3_close (priv->db); + sqlite3_free(error_msg); priv->db = NULL; if (retry) { diff --git a/src/cd-profile-db.c b/src/cd-profile-db.c index 57ab864f..e5b74e37 100644 --- a/src/cd-profile-db.c +++ b/src/cd-profile-db.c @@ -48,7 +48,7 @@ cd_profile_db_load (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); const gchar *statement; - g_autofree gchar *error_msg = NULL; + gchar *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -69,6 +69,7 @@ cd_profile_db_load (CdProfileDb *pdb, CD_CLIENT_ERROR_INTERNAL, "Can't open database: %s\n", sqlite3_errmsg (priv->db)); + sqlite3_free (error_msg); sqlite3_close (priv->db); return FALSE; } From 80621d986bcfbbfe73052b104a698e76b300b64d Mon Sep 17 00:00:00 2001 From: psykose Date: Thu, 8 Feb 2024 13:12:41 +0000 Subject: [PATCH 2/2] use char * instead of gchar * for pointers passed to sqlite3_exec --- src/cd-device-db.c | 16 ++++++++-------- src/cd-mapping-db.c | 18 +++++++++--------- src/cd-profile-db.c | 10 +++++----- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/cd-device-db.c b/src/cd-device-db.c index 3ae44ef2..ac87a527 100644 --- a/src/cd-device-db.c +++ b/src/cd-device-db.c @@ -48,7 +48,7 @@ cd_device_db_load (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -109,7 +109,7 @@ cd_device_db_empty (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_DEVICE_DB (ddb), FALSE); @@ -137,7 +137,7 @@ cd_device_db_add (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; @@ -175,7 +175,7 @@ cd_device_db_set_property (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; @@ -212,7 +212,7 @@ cd_device_db_remove (CdDeviceDb *ddb, { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement1 = NULL; gchar *statement2 = NULL; gint rc; @@ -277,7 +277,7 @@ cd_device_db_get_property (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; gchar *value = NULL; @@ -331,7 +331,7 @@ cd_device_db_get_devices (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -372,7 +372,7 @@ cd_device_db_get_properties (CdDeviceDb *ddb, GError **error) { CdDeviceDbPrivate *priv = GET_PRIVATE (ddb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; diff --git a/src/cd-mapping-db.c b/src/cd-mapping-db.c index 5ffd74dd..291274a4 100644 --- a/src/cd-mapping-db.c +++ b/src/cd-mapping-db.c @@ -67,7 +67,7 @@ cd_mapping_db_open (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -131,7 +131,7 @@ cd_mapping_db_load (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -230,7 +230,7 @@ cd_mapping_db_empty (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_MAPPING_DB (mdb), FALSE); @@ -259,7 +259,7 @@ cd_mapping_db_add (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; gint64 timestamp; @@ -307,7 +307,7 @@ cd_mapping_db_clear_timestamp (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; @@ -351,7 +351,7 @@ cd_mapping_db_remove (CdMappingDb *mdb, { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; @@ -406,7 +406,7 @@ cd_mapping_db_get_profiles (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -456,7 +456,7 @@ cd_mapping_db_get_devices (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; GPtrArray *array = NULL; @@ -522,7 +522,7 @@ cd_mapping_db_get_timestamp (CdMappingDb *mdb, GError **error) { CdMappingDbPrivate *priv = GET_PRIVATE (mdb); - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; guint64 timestamp = G_MAXUINT64; diff --git a/src/cd-profile-db.c b/src/cd-profile-db.c index e5b74e37..124fa09f 100644 --- a/src/cd-profile-db.c +++ b/src/cd-profile-db.c @@ -48,7 +48,7 @@ cd_profile_db_load (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_autofree gchar *path = NULL; @@ -98,7 +98,7 @@ cd_profile_db_empty (CdProfileDb *pdb, GError **error) { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); const gchar *statement; - gchar *error_msg = NULL; + char *error_msg = NULL; gint rc; g_return_val_if_fail (CD_IS_PROFILE_DB (pdb), FALSE); @@ -129,7 +129,7 @@ cd_profile_db_set_property (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; @@ -169,7 +169,7 @@ cd_profile_db_remove (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement = NULL; gint rc; @@ -223,7 +223,7 @@ cd_profile_db_get_property (CdProfileDb *pdb, { CdProfileDbPrivate *priv = GET_PRIVATE (pdb); gboolean ret = TRUE; - gchar *error_msg = NULL; + char *error_msg = NULL; gchar *statement; gint rc; From 08a32b2379fb5582f4312e59bf51a2823df56276 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Mon, 29 Jan 2024 10:37:11 +0000 Subject: [PATCH] Fix writing to the database with ProtectSystem=strict Fixes https://github.com/hughsie/colord/issues/166 --- data/colord.service.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/colord.service.in b/data/colord.service.in index 6825d944..c358dc4b 100644 --- a/data/colord.service.in +++ b/data/colord.service.in @@ -17,6 +17,10 @@ ProtectControlGroups=true RestrictRealtime=true RestrictAddressFamilies=AF_UNIX +ConfigurationDirectory=colord +StateDirectory=colord +CacheDirectory=colord + # drop all capabilities CapabilityBoundingSet=~CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_SYS_RAWIO CAP_SYS_TIME CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_MKNOD CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_RESOURCE CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_BOOT CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_WAKE_ALARM