Merge lp:~3v1n0/bamf/mime-types-fix-crash-1058260 into lp:bamf/0.4

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Michal Hruby
Approved revision: 491
Merged at revision: 485
Proposed branch: lp:~3v1n0/bamf/mime-types-fix-crash-1058260
Merge into: lp:bamf/0.4
Diff against target: 341 lines (+97/-61)
4 files modified
lib/libbamf/bamf-application.c (+2/-4)
src/bamf-application.c (+42/-57)
tests/bamfdaemon/data/mime-types.desktop (+10/-0)
tests/bamfdaemon/test-application.c (+43/-0)
To merge this branch: bzr merge lp:~3v1n0/bamf/mime-types-fix-crash-1058260
Reviewer Review Type Date Requested Status
Michal Hruby (community) Approve
Review via email: mp+127225@code.launchpad.net

Commit message

Daemon, BamfApplication: fix a crash on getting the supported mimes

Also remove the unneeded mimes_initialized, just use the pointer value and add tests.

Description of the change

Fix the function bamf_application_default_get_supported_mime_types that was leading to a crash in default implementation.

Tests added.

To post a comment you must log in.
Revision history for this message
Michal Hruby (mhr3) wrote :

66 + if (!new_mimes)
67 {
68 gchar *empty[] = {NULL};
69 -
70 - mimes = g_strdupv (empty);
71 + mimes = empty;
72 }

Ouch, looks pretty dangerous, you're taking address of a temporary that's not valid outside of that block.

181 + for (it = mimes; *it; it++)
182 + {
183 + g_variant_builder_add (&b, "s", *it);
184 + }

Why so complicated? How about g_variant_new_strv()? (or perhaps `g_variant_new("(@as)", g_variant_new_strv(...));`)

review: Needs Fixing
487. By Marco Trevisan (Treviño)

Daemon, tests: add one more mime types test (for invalid mimes)

488. By Marco Trevisan (Treviño)

Daemon, BamfApplication: be safer on managing empty mimes

489. By Marco Trevisan (Treviño)

BamfApplication: use g_variant_new_strv for building string arrays

490. By Marco Trevisan (Treviño)

Tests, Daemon: application code cleanup

491. By Marco Trevisan (Treviño)

Daemon, BamfApplication: no need to have an empty array... Just pass null to g_variant_new_strv

Revision history for this message
Michal Hruby (mhr3) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/libbamf/bamf-application.c'
--- lib/libbamf/bamf-application.c 2012-08-21 22:02:12 +0000
+++ lib/libbamf/bamf-application.c 2012-10-01 12:12:23 +0000
@@ -69,7 +69,6 @@
69 gchar *desktop_file;69 gchar *desktop_file;
70 GList *cached_xids;70 GList *cached_xids;
71 gchar **cached_mimes;71 gchar **cached_mimes;
72 gboolean mimes_initialized;
73 int show_stubs;72 int show_stubs;
74};73};
7574
@@ -79,7 +78,7 @@
79 GError *error = NULL;78 GError *error = NULL;
80 gchar **mimes = NULL;79 gchar **mimes = NULL;
8180
82 if (application->priv->mimes_initialized)81 if (application->priv->cached_mimes)
83 return g_strdupv (application->priv->cached_mimes);82 return g_strdupv (application->priv->cached_mimes);
8483
85 if (!_bamf_view_remote_ready (BAMF_VIEW (application)))84 if (!_bamf_view_remote_ready (BAMF_VIEW (application)))
@@ -97,7 +96,7 @@
9796
98 return NULL;97 return NULL;
99 }98 }
100 application->priv->mimes_initialized = TRUE;99
101 application->priv->cached_mimes = g_strdupv (mimes);100 application->priv->cached_mimes = g_strdupv (mimes);
102101
103 return mimes;102 return mimes;
@@ -357,7 +356,6 @@
357 g_strfreev (self->priv->cached_mimes);356 g_strfreev (self->priv->cached_mimes);
358357
359 self->priv->cached_mimes = g_strdupv ((gchar**)mimes);358 self->priv->cached_mimes = g_strdupv ((gchar**)mimes);
360 self->priv->mimes_initialized = TRUE;
361}359}
362360
363static void361static void
364362
=== modified file 'src/bamf-application.c'
--- src/bamf-application.c 2012-09-14 19:04:14 +0000
+++ src/bamf-application.c 2012-10-01 12:12:23 +0000
@@ -44,11 +44,9 @@
44 char * app_type;44 char * app_type;
45 char * icon;45 char * icon;
46 char * wmclass;46 char * wmclass;
47 char ** mimes;
47 gboolean is_tab_container;48 gboolean is_tab_container;
48 gboolean show_stubs;49 gboolean show_stubs;
49
50 gchar **mimes;
51 gboolean mimes_initialized;
52};50};
5351
54enum {52enum {
@@ -70,32 +68,28 @@
7068
71void69void
72bamf_application_supported_mime_types_changed (BamfApplication *application,70bamf_application_supported_mime_types_changed (BamfApplication *application,
73 const gchar **maybe_mimes)71 const gchar **new_mimes)
74{72{
75 gchar **mimes;73 gchar **mimes = (gchar **) new_mimes;
7674
77 if (!maybe_mimes)75 if (!new_mimes)
78 {76 {
79 gchar *empty[] = {NULL};77 gchar *empty[] = {NULL};
80
81 mimes = g_strdupv (empty);78 mimes = g_strdupv (empty);
82 }79 }
83
84 mimes = (gchar **)maybe_mimes;
8580
86 g_signal_emit_by_name (application->priv->dbus_iface, "supported-mime-types-changed", mimes);81 g_signal_emit_by_name (application->priv->dbus_iface, "supported-mime-types-changed", mimes);
87 application->priv->mimes_initialized = TRUE;82
83 if (!new_mimes)
84 {
85 g_strfreev (mimes);
86 mimes = NULL;
87 }
8888
89 if (application->priv->mimes)89 if (application->priv->mimes)
90 g_strfreev (application->priv->mimes);90 g_strfreev (application->priv->mimes);
9191
92 application->priv->mimes = mimes;92 application->priv->mimes = mimes;
93
94 if (maybe_mimes == NULL)
95 {
96 g_strfreev (mimes);
97 }
98
99}93}
10094
101static gboolean95static gboolean
@@ -116,21 +110,19 @@
116 GError *error = NULL;110 GError *error = NULL;
117111
118 g_key_file_load_from_file (key_file, desktop_file, (GKeyFileFlags) 0, &error);112 g_key_file_load_from_file (key_file, desktop_file, (GKeyFileFlags) 0, &error);
119 application->priv->mimes_initialized = TRUE;
120113
121 if (error)114 if (error)
122 {115 {
123 g_key_file_free(key_file);116 g_key_file_free (key_file);
124 g_error_free (error);117 g_error_free (error);
125 return NULL;118 return NULL;
126 }119 }
127120
128 char** mimes = g_key_file_get_string_list (key_file, "Desktop Entry", "MimeType", NULL, NULL);121 char** mimes = g_key_file_get_string_list (key_file, "Desktop Entry", "MimeType", NULL, NULL);
122 g_signal_emit (application, application_signals[SUPPORTED_MIMES_CHANGED], 0, mimes);
129123
130 g_key_file_free (key_file);124 g_key_file_free (key_file);
131125
132 g_signal_emit (application, application_signals[SUPPORTED_MIMES_CHANGED], 0, mimes);
133
134 return mimes;126 return mimes;
135}127}
136128
@@ -139,14 +131,10 @@
139{131{
140 g_return_val_if_fail (BAMF_IS_APPLICATION (application), NULL);132 g_return_val_if_fail (BAMF_IS_APPLICATION (application), NULL);
141133
142 if (application->priv->mimes_initialized)134 if (application->priv->mimes)
143 return g_strdupv (application->priv->mimes);135 return g_strdupv (application->priv->mimes);
144136
145 gchar **mimes = BAMF_APPLICATION_GET_CLASS (application)->get_supported_mime_types (application);137 gchar **mimes = BAMF_APPLICATION_GET_CLASS (application)->get_supported_mime_types (application);
146
147 if (application->priv->mimes)
148 g_strfreev (application->priv->mimes);
149
150 application->priv->mimes = mimes;138 application->priv->mimes = mimes;
151139
152 return g_strdupv (mimes);140 return g_strdupv (mimes);
@@ -798,11 +786,11 @@
798{786{
799 GVariant *out_variant;787 GVariant *out_variant;
800 BamfView *focusable_child;788 BamfView *focusable_child;
801 789
802 out_variant = NULL;790 out_variant = NULL;
803 791
804 focusable_child = bamf_application_get_focusable_child (self);792 focusable_child = bamf_application_get_focusable_child (self);
805 793
806 if (focusable_child == NULL)794 if (focusable_child == NULL)
807 {795 {
808 out_variant = g_variant_new("(s)", "");796 out_variant = g_variant_new("(s)", "");
@@ -810,9 +798,9 @@
810 else798 else
811 {799 {
812 const gchar *path;800 const gchar *path;
813 801
814 path = bamf_view_get_path (BAMF_VIEW (focusable_child));802 path = bamf_view_get_path (BAMF_VIEW (focusable_child));
815 803
816 out_variant = g_variant_new("(s)", path);804 out_variant = g_variant_new("(s)", path);
817 }805 }
818806
@@ -835,29 +823,26 @@
835823
836static gboolean824static gboolean
837on_dbus_handle_supported_mime_types (BamfDBusItemApplication *interface,825on_dbus_handle_supported_mime_types (BamfDBusItemApplication *interface,
838 GDBusMethodInvocation *invocation,826 GDBusMethodInvocation *invocation,
839 BamfApplication *self)827 BamfApplication *self)
840{828{
829 GVariant *list;
830 GVariant *value;
831
841 gchar **mimes = bamf_application_get_supported_mime_types (self);832 gchar **mimes = bamf_application_get_supported_mime_types (self);
842833
843 GVariantBuilder *builder;
844 GVariant *value;
845 gchar **it;
846
847 builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
848 if (mimes)834 if (mimes)
849 for (it = mimes; *it; it++)835 {
850 {836 list = g_variant_new_strv ((const gchar**) mimes, -1);
851 g_variant_builder_add (builder, "s", *it);837 g_strfreev (mimes);
852 }838 }
853 value = g_variant_new ("(as)", builder);839 else
854840 {
855 g_dbus_method_invocation_return_value (invocation,841 list = g_variant_new_strv (NULL, 0);
856 value);842 }
857843
858 g_variant_builder_unref (builder);844 value = g_variant_new ("(@as)", list);
859845 g_dbus_method_invocation_return_value (invocation, value);
860 g_strfreev (mimes);
861846
862 return TRUE;847 return TRUE;
863}848}
@@ -868,15 +853,15 @@
868 BamfApplication *self)853 BamfApplication *self)
869{854{
870 gchar *name, *path;855 gchar *name, *path;
871 856
872 bamf_application_get_application_menu (self, &name, &path);857 bamf_application_get_application_menu (self, &name, &path);
873 858
874 name = name ? name : "";859 name = name ? name : "";
875 path = path ? path : "";860 path = path ? path : "";
876 861
877 g_dbus_method_invocation_return_value (invocation,862 g_dbus_method_invocation_return_value (invocation,
878 g_variant_new ("(ss)", name, path));863 g_variant_new ("(ss)", name, path));
879 864
880 return TRUE;865 return TRUE;
881}866}
882867
@@ -961,7 +946,7 @@
961 priv->app_type = g_strdup ("system");946 priv->app_type = g_strdup ("system");
962 priv->show_stubs = TRUE;947 priv->show_stubs = TRUE;
963 priv->wmclass = NULL;948 priv->wmclass = NULL;
964 949
965 /* Initializing the dbus interface */950 /* Initializing the dbus interface */
966 priv->dbus_iface = bamf_dbus_item_application_skeleton_new ();951 priv->dbus_iface = bamf_dbus_item_application_skeleton_new ();
967952
@@ -1025,8 +1010,8 @@
1025 klass->supported_mimes_changed = bamf_application_supported_mime_types_changed;1010 klass->supported_mimes_changed = bamf_application_supported_mime_types_changed;
10261011
1027 g_type_class_add_private (klass, sizeof (BamfApplicationPrivate));1012 g_type_class_add_private (klass, sizeof (BamfApplicationPrivate));
1028 1013
1029 application_signals[SUPPORTED_MIMES_CHANGED] = 1014 application_signals[SUPPORTED_MIMES_CHANGED] =
1030 g_signal_new ("supported-mimes-changed",1015 g_signal_new ("supported-mimes-changed",
1031 G_OBJECT_CLASS_TYPE (klass),1016 G_OBJECT_CLASS_TYPE (klass),
1032 G_SIGNAL_RUN_FIRST,1017 G_SIGNAL_RUN_FIRST,
@@ -1034,7 +1019,7 @@
1034 NULL, NULL,1019 NULL, NULL,
1035 g_cclosure_marshal_generic,1020 g_cclosure_marshal_generic,
1036 G_TYPE_NONE, 1,1021 G_TYPE_NONE, 1,
1037 G_TYPE_STRV); 1022 G_TYPE_STRV);
1038}1023}
10391024
1040BamfApplication *1025BamfApplication *
10411026
=== added file 'tests/bamfdaemon/data/mime-types.desktop'
--- tests/bamfdaemon/data/mime-types.desktop 1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/mime-types.desktop 2012-10-01 12:12:23 +0000
@@ -0,0 +1,10 @@
1#!/usr/bin/env xdg-open
2
3[Desktop Entry]
4Name=Mime Text Editor
5GenericName=Text Editor
6Exec=mime-test-text-editor %F
7Terminal=false
8Type=Application
9MimeType=text/plain;text/x-chdr;text/x-csrc;text/html;text/css;text/x-diff;application/xml;
10Categories=TextEditor;Development;Utility;
011
=== modified file 'tests/bamfdaemon/test-application.c'
--- tests/bamfdaemon/test-application.c 2012-07-17 19:03:36 +0000
+++ tests/bamfdaemon/test-application.c 2012-10-01 12:12:23 +0000
@@ -31,6 +31,8 @@
31static void test_allocation (void);31static void test_allocation (void);
32static void test_desktop_file (void);32static void test_desktop_file (void);
33static void test_desktop_no_icon (void);33static void test_desktop_no_icon (void);
34static void test_get_mime_types (void);
35static void test_get_mime_types_none (void);
34static void test_urgent (void);36static void test_urgent (void);
35static void test_active (void);37static void test_active (void);
36static void test_get_xids (void);38static void test_get_xids (void);
@@ -55,6 +57,8 @@
55 g_test_add_func (DOMAIN"/Allocation", test_allocation);57 g_test_add_func (DOMAIN"/Allocation", test_allocation);
56 g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file);58 g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file);
57 g_test_add_func (DOMAIN"/DesktopFile/NoIcon", test_desktop_no_icon);59 g_test_add_func (DOMAIN"/DesktopFile/NoIcon", test_desktop_no_icon);
60 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/Valid", test_get_mime_types);
61 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/None", test_get_mime_types_none);
58 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);62 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);
59 g_test_add_func (DOMAIN"/Xids", test_get_xids);63 g_test_add_func (DOMAIN"/Xids", test_get_xids);
60 g_test_add_func (DOMAIN"/Events/Active", test_active);64 g_test_add_func (DOMAIN"/Events/Active", test_active);
@@ -117,6 +121,45 @@
117}121}
118122
119static void123static void
124test_get_mime_types (void)
125{
126 BamfApplication *application;
127 const char* mime_types_desktop = TESTDIR"/bamfdaemon/data/mime-types.desktop";
128
129 application = bamf_application_new_from_desktop_file (mime_types_desktop);
130 g_assert_cmpstr (bamf_application_get_desktop_file (application), ==, mime_types_desktop);
131
132 gchar** mimes = bamf_application_get_supported_mime_types (application);
133
134 g_assert_cmpuint (g_strv_length (mimes), ==, 7);
135 g_assert_cmpstr (mimes[0], ==, "text/plain");
136 g_assert_cmpstr (mimes[1], ==, "text/x-chdr");
137 g_assert_cmpstr (mimes[2], ==, "text/x-csrc");
138 g_assert_cmpstr (mimes[3], ==, "text/html");
139 g_assert_cmpstr (mimes[4], ==, "text/css");
140 g_assert_cmpstr (mimes[5], ==, "text/x-diff");
141 g_assert_cmpstr (mimes[6], ==, "application/xml");
142
143 g_strfreev (mimes);
144 g_object_unref (application);
145}
146
147static void
148test_get_mime_types_none (void)
149{
150 BamfApplication *application;
151 const char* mime_types_desktop = TESTDIR"/bamfdaemon/data/test-bamf-app.desktop";
152
153 application = bamf_application_new_from_desktop_file (mime_types_desktop);
154 g_assert_cmpstr (bamf_application_get_desktop_file (application), ==, mime_types_desktop);
155
156 gchar** mimes = bamf_application_get_supported_mime_types (application);
157 g_assert (!mimes);
158
159 g_object_unref (application);
160}
161
162static void
120on_urgent_changed (BamfApplication *application, gboolean result, gpointer data)163on_urgent_changed (BamfApplication *application, gboolean result, gpointer data)
121{164{
122 signal_seen = TRUE;165 signal_seen = TRUE;

Subscribers

People subscribed via source and target branches