[gnome-software] packagekit: Do not crash when getting an invalid ID from PackageKit



commit 56d11c5712e3d92b7fa8d214d643a93721a64616
Author: Richard Hughes <richard hughsie com>
Date:   Sun Dec 10 14:14:23 2017 +0000

    packagekit: Do not crash when getting an invalid ID from PackageKit
    
    Fixes half of https://bugs.freedesktop.org/show_bug.cgi?id=104171

 plugins/packagekit/gs-plugin-packagekit-local.c |    7 +++++++
 plugins/packagekit/gs-plugin-packagekit.c       |    8 ++++++++
 plugins/packagekit/gs-plugin-systemd-updates.c  |   11 ++++++++++-
 plugins/packagekit/packagekit-common.c          |    4 ++++
 4 files changed, 29 insertions(+), 1 deletions(-)
---
diff --git a/plugins/packagekit/gs-plugin-packagekit-local.c b/plugins/packagekit/gs-plugin-packagekit-local.c
index f93d1dd..0194482 100644
--- a/plugins/packagekit/gs-plugin-packagekit-local.c
+++ b/plugins/packagekit/gs-plugin-packagekit-local.c
@@ -204,6 +204,13 @@ gs_plugin_file_to_app (GsPlugin *plugin,
                             gs_plugin_get_name (plugin));
        package_id = pk_details_get_package_id (item);
        split = pk_package_id_split (package_id);
+       if (split == NULL) {
+               g_set_error (error,
+                            GS_PLUGIN_ERROR,
+                            GS_PLUGIN_ERROR_INVALID_FORMAT,
+                            "invalid package-id: %s", package_id);
+               return FALSE;
+       }
        basename = g_path_get_basename (filename);
        gs_app_set_management_plugin (app, "packagekit");
        gs_app_set_kind (app, AS_APP_KIND_GENERIC);
diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index 26ec0da..60c2f51 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -103,6 +103,14 @@ gs_plugin_add_sources_related (GsPlugin *plugin,
                g_auto(GStrv) split = NULL;
                app = gs_app_list_index (installed, i);
                split = pk_package_id_split (gs_app_get_source_id_default (app));
+               if (split == NULL) {
+                       g_set_error (error,
+                                    GS_PLUGIN_ERROR,
+                                    GS_PLUGIN_ERROR_INVALID_FORMAT,
+                                    "invalid package-id: %s",
+                                    gs_app_get_source_id_default (app));
+                       return FALSE;
+               }
                if (g_str_has_prefix (split[PK_PACKAGE_ID_DATA], "installed:")) {
                        id = split[PK_PACKAGE_ID_DATA] + 10;
                        app_tmp = g_hash_table_lookup (hash, id);
diff --git a/plugins/packagekit/gs-plugin-systemd-updates.c b/plugins/packagekit/gs-plugin-systemd-updates.c
index ff3b3f1..c303723 100644
--- a/plugins/packagekit/gs-plugin-systemd-updates.c
+++ b/plugins/packagekit/gs-plugin-systemd-updates.c
@@ -180,12 +180,21 @@ gs_plugin_add_updates (GsPlugin *plugin,
                        continue;
                }
 
+               /* get ID details */
+               split = pk_package_id_split (package_ids[i]);
+               if (split == NULL) {
+                       g_set_error (error,
+                                    GS_PLUGIN_ERROR,
+                                    GS_PLUGIN_ERROR_INVALID_FORMAT,
+                                    "invalid package-id: %s", package_ids[i]);
+                       return FALSE;
+               }
+
                /* create new app */
                app = gs_app_new (NULL);
                gs_app_add_quirk (app, AS_APP_QUIRK_NEEDS_REBOOT);
                gs_app_set_management_plugin (app, "packagekit");
                gs_app_add_source_id (app, package_ids[i]);
-               split = pk_package_id_split (package_ids[i]);
                gs_app_add_source (app, split[PK_PACKAGE_ID_NAME]);
                gs_app_set_update_version (app, split[PK_PACKAGE_ID_VERSION]);
                gs_app_set_state (app, AS_APP_STATE_UPDATABLE);
diff --git a/plugins/packagekit/packagekit-common.c b/plugins/packagekit/packagekit-common.c
index 4b53c79..efc664c 100644
--- a/plugins/packagekit/packagekit-common.c
+++ b/plugins/packagekit/packagekit-common.c
@@ -445,7 +445,11 @@ gs_pk_compare_ids (const gchar *package_id1, const gchar *package_id2)
        g_auto(GStrv) split2 = NULL;
 
        split1 = pk_package_id_split (package_id1);
+       if (split1 == NULL)
+               return FALSE;
        split2 = pk_package_id_split (package_id2);
+       if (split2 == NULL)
+               return FALSE;
        ret = (g_strcmp0 (split1[PK_PACKAGE_ID_NAME],
                          split2[PK_PACKAGE_ID_NAME]) == 0 &&
               g_strcmp0 (split1[PK_PACKAGE_ID_VERSION],


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]