Merge lp:~gue5t/midori/extension-tests into lp:midori

Proposed by gue5t gue5t
Status: Merged
Approved by: Paweł Forysiuk
Approved revision: 7094
Merged at revision: 7099
Proposed branch: lp:~gue5t/midori/extension-tests
Merge into: lp:midori
Diff against target: 173 lines (+48/-17)
2 files modified
midori/midori-extension.c (+2/-2)
tests/extensions.c (+46/-15)
To merge this branch: bzr merge lp:~gue5t/midori/extension-tests
Reviewer Review Type Date Requested Status
Paweł Forysiuk Approve
Review via email: mp+283894@code.launchpad.net

Commit message

Fix memory leaks and logic errors in extension loading and tests

Description of the change

In tests/extensions.c, there are lots of leaks which are fixed with the appropriate unref calls. extension_load is changed to return the extension it loads, so it can be freed. In addition, extension_load is changed to only register the tests when told to do so, because extension_load is called twice to exercise loading an extension multiple times--but GLib does not allow registering the same test twice. This is a correctness fix, and without it running "./tests/extensions -e ./extensions/libYOURFAVORITEEXTENSION.so" fails with a GLib error for every extension.

tests/extension.c also had a few misleading variable names which have been fixed.

In midori/midori-extension.c there's a memory leak where setting->name was only being freed for String or StringList settings, and the setting struct itself was never being freed. These leaks are fixed.

To post a comment you must log in.
Revision history for this message
Paweł Forysiuk (tuxator) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'midori/midori-extension.c'
2--- midori/midori-extension.c 2015-07-06 21:26:46 +0000
3+++ midori/midori-extension.c 2016-01-26 05:52:06 +0000
4@@ -74,21 +74,21 @@
5
6 void me_setting_free (gpointer setting)
7 {
8+ /* setting->name is freed by the GHashTable itself */
9 MESettingString* string_setting = (MESettingString*)setting;
10 MESettingStringList* strlist_setting = (MESettingStringList*)setting;
11
12 if (string_setting->type == G_TYPE_STRING)
13 {
14- g_free (string_setting->name);
15 g_free (string_setting->default_value);
16 g_free (string_setting->value);
17 }
18 if (strlist_setting->type == G_TYPE_STRV)
19 {
20- g_free (strlist_setting->name);
21 g_strfreev (strlist_setting->default_value);
22 g_strfreev (strlist_setting->value);
23 }
24+ g_free (setting);
25 }
26
27 #define midori_extension_can_install_setting(extension, name) \
28
29=== modified file 'tests/extensions.c'
30--- tests/extensions.c 2016-01-15 19:18:17 +0000
31+++ tests/extensions.c 2016-01-26 05:52:06 +0000
32@@ -56,6 +56,8 @@
33 midori_extension_deactivate (extension);
34 g_assert (!midori_extension_is_active (extension));
35 g_assert (g_object_get_data (G_OBJECT (extension), "deactivated") == magic);
36+ g_object_unref (app);
37+ g_object_unref (extension);
38 }
39
40 static MidoriExtension*
41@@ -113,6 +115,7 @@
42 nihilist = midori_extension_get_boolean (extension, "nihilist");
43 g_assert (!nihilist);
44 midori_extension_deactivate (extension);
45+ g_object_unref (extension);
46
47 extension = extension_mock_object ();
48 midori_extension_install_integer (extension, "age", 88);
49@@ -127,6 +130,7 @@
50 age = midori_extension_get_integer (extension, "age");
51 g_assert_cmpint (age, ==, 66);
52 midori_extension_deactivate (extension);
53+ g_object_unref (extension);
54
55 extension = extension_mock_object ();
56 midori_extension_install_string (extension, "lastname", "Thomas Mann");
57@@ -141,6 +145,7 @@
58 lastname = midori_extension_get_string (extension, "lastname");
59 g_assert_cmpstr (lastname, ==, "Theodor Fontane");
60 midori_extension_deactivate (extension);
61+ g_object_unref (extension);
62
63 extension = extension_mock_object ();
64 midori_extension_install_string_list (extension, "pets", pet_names, 3);
65@@ -163,6 +168,8 @@
66 g_strfreev (names);
67 g_assert_cmpint (names_n, ==, 2);
68 midori_extension_deactivate (extension);
69+ g_object_unref (extension);
70+ g_object_unref (app);
71 }
72
73 static void
74@@ -175,13 +182,17 @@
75 g_object_unref (app);
76 }
77
78-static void
79-extension_load (const gchar* absolute_filename)
80+static GObject*
81+extension_load (const gchar* extension_path, gboolean register_tests)
82 {
83- g_assert (g_file_test (absolute_filename, G_FILE_TEST_EXISTS) == 1);
84- gchar* extension_path = g_path_get_dirname (absolute_filename);
85- gchar* filename = g_path_get_basename (absolute_filename);
86- GObject* extension = midori_extension_load_from_file (extension_path, filename, FALSE, TRUE);
87+ g_assert (g_file_test (extension_path, G_FILE_TEST_EXISTS) == 1);
88+ gchar* extension_dir = g_path_get_dirname (extension_path);
89+ gchar* filename = g_path_get_basename (extension_path);
90+
91+ GObject* extension = midori_extension_load_from_file (extension_dir, filename, FALSE, TRUE);
92+
93+ if (register_tests)
94+ {
95 if (KATZE_IS_ARRAY (extension))
96 {
97 MidoriExtension* extension_item;
98@@ -201,6 +212,11 @@
99 g_test_add_data_func (path, extension, extension_activate);
100 g_free (path);
101 }
102+ }
103+
104+ g_free (extension_dir);
105+ g_free (filename);
106+ return extension;
107 }
108
109 static void
110@@ -208,6 +224,7 @@
111 {
112 gchar* filename = midori_paths_get_extension_config_dir ("adblock");
113 g_assert (g_file_test (filename, G_FILE_TEST_EXISTS) == 1);
114+ g_free (filename);
115 }
116
117 int
118@@ -215,13 +232,12 @@
119 char** argv)
120 {
121 midori_test_init (&argc, &argv);
122- gchar* extension;
123+ gchar* extension_path = NULL;
124 GOptionEntry entries[] = {
125- { "extension", 'e', 0, G_OPTION_ARG_STRING, &extension,
126+ { "extension", 'e', 0, G_OPTION_ARG_STRING, &extension_path,
127 "Execute cases defined in extension_init", "EXTENSION" },
128 { NULL }
129 };
130- extension = NULL;
131 midori_app_setup (&argc, &argv, entries);
132 midori_paths_init (MIDORI_RUNTIME_MODE_NORMAL, NULL);
133 #ifndef HAVE_WEBKIT2
134@@ -229,7 +245,10 @@
135 SOUP_TYPE_COOKIE_JAR);
136 #endif
137
138- if (extension == NULL)
139+ GObject* extension = NULL;
140+ GObject* extension2 = NULL;
141+
142+ if (extension_path == NULL)
143 {
144 g_test_add_func ("/extensions/create", extension_create);
145 g_test_add_func ("/extensions/settings", extension_settings);
146@@ -238,10 +257,22 @@
147 else
148 {
149 g_assert (g_module_supported ());
150+ extension = extension_load (extension_path, TRUE);
151 /* We require that extensions can be loaded repeatedly */
152- extension_load (extension);
153- extension_load (extension);
154- }
155-
156- return g_test_run ();
157+ extension2 = extension_load (extension_path, FALSE);
158+ }
159+
160+ int result = g_test_run ();
161+
162+ if (extension)
163+ {
164+ midori_extension_deactivate (MIDORI_EXTENSION (extension));
165+ g_object_unref (extension);
166+ }
167+ /* The second copy loaded does not get activated, because no tests are
168+ registered for it */
169+ if (extension2)
170+ g_object_unref (extension2);
171+
172+ return result;
173 }

Subscribers

People subscribed via source and target branches

to all changes: