Merge lp:~nick-dedekind/qmenumodel/lp1239394 into lp:~phablet-team/qmenumodel/trunk

Proposed by Nick Dedekind
Status: Merged
Approved by: Lars Karlitski
Approved revision: 96
Merged at revision: 95
Proposed branch: lp:~nick-dedekind/qmenumodel/lp1239394
Merge into: lp:~phablet-team/qmenumodel/trunk
Diff against target: 147 lines (+57/-17)
1 file modified
libqmenumodel/src/unitymenumodel.cpp (+57/-17)
To merge this branch: bzr merge lp:~nick-dedekind/qmenumodel/lp1239394
Reviewer Review Type Date Requested Status
Lars Karlitski (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+190965@code.launchpad.net

Commit message

Added pointer checks for items/iterators. (lp#1239394)

Description of the change

Added pointer checks for items/iterators. (lp#1239394)

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Lars Karlitski (larsu) wrote :

g_sequence_get() never returns NULL, those checks are unnecessary.

g_sequence_get_iter_at_pos() always returns a valid iter, so e don't need the check for NULL.

Having the is_end_iter() check makes sense to me, but we should look for the actual cause of this crash: something is trying to access an invalid row name. Maybe we should even warn when that happens instead of silently failing?

review: Needs Fixing
Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> g_sequence_get() never returns NULL, those checks are unnecessary.
>
> g_sequence_get_iter_at_pos() always returns a valid iter, so e don't need the
> check for NULL.
>
> Having the is_end_iter() check makes sense to me, but we should look for the
> actual cause of this crash: something is trying to access an invalid row name.
> Maybe we should even warn when that happens instead of silently failing?

I think it's a qml object (a menu item from unitymenumodel) which is updated as it's being deleted (removed from model), not sure we can get around it.

96. By Nick Dedekind

removed unnecessary pointer checks

Revision history for this message
Nick Dedekind (nick-dedekind) wrote :

> g_sequence_get() never returns NULL, those checks are unnecessary.
>
> g_sequence_get_iter_at_pos() always returns a valid iter, so e don't need the
> check for NULL.
>
> Having the is_end_iter() check makes sense to me, but we should look for the
> actual cause of this crash: something is trying to access an invalid row name.
> Maybe we should even warn when that happens instead of silently failing?

Removed checks for null pointer on g_sequence_get_iter_at_pos

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Lars Karlitski (larsu) wrote :

Cool, thanks for the patch.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libqmenumodel/src/unitymenumodel.cpp'
2--- libqmenumodel/src/unitymenumodel.cpp 2013-10-11 21:00:09 +0000
3+++ libqmenumodel/src/unitymenumodel.cpp 2013-10-14 16:31:42 +0000
4@@ -395,9 +395,18 @@
5
6 QVariant UnityMenuModel::data(const QModelIndex &index, int role) const
7 {
8+ GSequenceIter *it;
9 GtkMenuTrackerItem *item;
10
11- item = (GtkMenuTrackerItem *) g_sequence_get (g_sequence_get_iter_at_pos (priv->items, index.row()));
12+ it = g_sequence_get_iter_at_pos (priv->items, index.row());
13+ if (g_sequence_iter_is_end (it)) {
14+ return QVariant();
15+ }
16+
17+ item = (GtkMenuTrackerItem *) g_sequence_get (it);
18+ if (!item) {
19+ return QVariant();
20+ }
21
22 switch (role) {
23 case LabelRole:
24@@ -497,12 +506,14 @@
25 UnityMenuModel *model;
26
27 it = g_sequence_get_iter_at_pos (priv->items, position);
28- if (g_sequence_iter_is_end (it))
29+ if (g_sequence_iter_is_end (it)) {
30 return NULL;
31+ }
32
33 item = (GtkMenuTrackerItem *) g_sequence_get (it);
34- if (!gtk_menu_tracker_item_get_has_submenu (item))
35+ if (!item || !gtk_menu_tracker_item_get_has_submenu (item)) {
36 return NULL;
37+ }
38
39 model = (UnityMenuModel *) g_object_get_qdata (G_OBJECT (item), unity_submenu_model_quark ());
40 if (model == NULL) {
41@@ -603,10 +614,19 @@
42
43 bool UnityMenuModel::loadExtendedAttributes(int position, const QVariantMap &schema)
44 {
45+ GSequenceIter *it;
46 GtkMenuTrackerItem *item;
47 QVariantMap *extendedAttrs;
48
49- item = (GtkMenuTrackerItem *) g_sequence_get (g_sequence_get_iter_at_pos (priv->items, position));
50+ it = g_sequence_get_iter_at_pos (priv->items, position);
51+ if (g_sequence_iter_is_end (it)) {
52+ return false;
53+ }
54+
55+ item = (GtkMenuTrackerItem *) g_sequence_get (it);
56+ if (!item) {
57+ return false;
58+ }
59
60 extendedAttrs = new QVariantMap;
61
62@@ -647,9 +667,18 @@
63
64 void UnityMenuModel::activate(int index, const QVariant& parameter)
65 {
66+ GSequenceIter *it;
67 GtkMenuTrackerItem *item;
68
69- item = (GtkMenuTrackerItem *) g_sequence_get (g_sequence_get_iter_at_pos (priv->items, index));
70+ it = g_sequence_get_iter_at_pos (priv->items, index);
71+ if (g_sequence_iter_is_end (it)) {
72+ return;
73+ }
74+
75+ item = (GtkMenuTrackerItem *) g_sequence_get (it);
76+ if (!item) {
77+ return;
78+ }
79
80 if (parameter.isValid()) {
81 gchar *action;
82@@ -665,12 +694,20 @@
83
84 void UnityMenuModel::changeState(int index, const QVariant& parameter)
85 {
86+ GSequenceIter *it;
87 GtkMenuTrackerItem* item;
88 GVariant* data;
89 GVariant* current_state;
90
91- item = (GtkMenuTrackerItem *) g_sequence_get (g_sequence_get_iter_at_pos (priv->items, index));
92- if (!item) return;
93+ it = g_sequence_get_iter_at_pos (priv->items, index);
94+ if (g_sequence_iter_is_end (it)) {
95+ return;
96+ }
97+
98+ item = (GtkMenuTrackerItem *) g_sequence_get (it);
99+ if (!item) {
100+ return;
101+ }
102
103 current_state = gtk_menu_tracker_item_get_action_state (item);
104 if (current_state) {
105@@ -712,22 +749,21 @@
106
107 GSequenceIter *it;
108 it = g_sequence_get_iter_at_pos (priv->items, ummrce->position);
109- if (it) {
110- beginInsertRows(QModelIndex(), ummrce->position, ummrce->position);
111-
112- it = g_sequence_insert_before (it, g_object_ref (ummrce->item));
113- g_object_set_qdata (G_OBJECT (ummrce->item), unity_menu_model_quark (), this);
114- g_signal_connect (ummrce->item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it);
115-
116- endInsertRows();
117- }
118+
119+ beginInsertRows(QModelIndex(), ummrce->position, ummrce->position);
120+
121+ it = g_sequence_insert_before (it, g_object_ref (ummrce->item));
122+ g_object_set_qdata (G_OBJECT (ummrce->item), unity_menu_model_quark (), this);
123+ g_signal_connect (ummrce->item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it);
124+
125+ endInsertRows();
126 return true;
127 } else if (e->type() == UnityMenuModelRemoveRowEvent::eventType) {
128 UnityMenuModelRemoveRowEvent *ummrre = static_cast<UnityMenuModelRemoveRowEvent*>(e);
129
130 GSequenceIter *it;
131 it = g_sequence_get_iter_at_pos (priv->items, ummrre->position);
132- if (it) {
133+ if (!g_sequence_iter_is_end (it)) {
134 beginRemoveRows(QModelIndex(), ummrre->position, ummrre->position);
135
136 g_sequence_remove (it);
137@@ -799,6 +835,10 @@
138 const gchar *action_namespace;
139
140 item = (GtkMenuTrackerItem *) g_sequence_get (iter);
141+ if (!item) {
142+ return g_strdup (name);
143+ }
144+
145 action_namespace = gtk_menu_tracker_item_get_action_namespace (item);
146 if (action_namespace != NULL)
147 return g_strjoin (".", action_namespace, name, NULL);

Subscribers

People subscribed via source and target branches