Merge lp:~charlesk/libindicate/lp-957611 into lp:libindicate/0.7

Proposed by Charles Kerr
Status: Merged
Approved by: Charles Kerr
Approved revision: 451
Merge reported by: Charles Kerr
Merged at revision: not available
Proposed branch: lp:~charlesk/libindicate/lp-957611
Merge into: lp:libindicate/0.7
Diff against target: 130 lines (+74/-46)
1 file modified
libindicate/listener.c (+74/-46)
To merge this branch: bzr merge lp:~charlesk/libindicate/lp-957611
Reviewer Review Type Date Requested Status
Lars Karlitski (community) Approve
Review via email: mp+98056@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Charles Kerr (charlesk) wrote :

Before:

  if (error) {
    g_warning ("error!");
    goto cleanup;
  }
  GVariant foo = bar; /* Coverity is unhappy about foo + goto */
  yadda;
cleanup:
   ...

After:

  if (error) {
    g_warning ("error!");
  } else {
    GVariant foo = bar;
    yadda;
  }
  ...

Revision history for this message
Lars Karlitski (larsu) wrote :

Has nothing to do with the intention of the patch, but 'value' is still leaked (line 56 in the diff).

review: Needs Fixing
Revision history for this message
Charles Kerr (charlesk) wrote :

Thank you lars!

lp:~charlesk/libindicate/lp-957611 updated
451. By Charles Kerr

fix pre-existing GVariant leak that my patch didn't fix. reported by larsu

Revision history for this message
Lars Karlitski (larsu) wrote :

Excellent, thank you Charles!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libindicate/listener.c'
2--- libindicate/listener.c 2012-02-09 23:17:59 +0000
3+++ libindicate/listener.c 2012-03-19 20:33:20 +0000
4@@ -958,52 +958,80 @@
5 if (error != NULL) {
6 g_warning("Unable to get property data: %s", error->message);
7 g_error_free(error);
8- goto cleanup;
9- }
10-
11- GVariant * value = g_variant_get_child_value(retvalue, 0);
12- if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT)) {
13- value = g_variant_get_variant(value);
14- }
15-
16- switch (get_property_data->type) {
17- case PROPERTY_TYPE_VARIANT: {
18- /* Just pass the GVariant along. */
19- indicate_listener_get_property_variant_cb cb =(indicate_listener_get_property_variant_cb)get_property_data->cb;
20- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, value, get_property_data->data);
21- break;
22- }
23- case PROPERTY_TYPE_STRING: {
24- /* Just pass the string along. */
25- indicate_listener_get_property_cb cb = (indicate_listener_get_property_cb)get_property_data->cb;
26- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, g_variant_get_string(value, NULL), get_property_data->data);
27- break;
28- }
29- case PROPERTY_TYPE_TIME: {
30- /* Convert it to a time val */
31- indicate_listener_get_property_time_cb cb = (indicate_listener_get_property_time_cb)get_property_data->cb;
32- GTimeVal time;
33- if (g_time_val_from_iso8601(g_variant_get_string(value, NULL), &time)) {
34- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, &time, get_property_data->data);
35- }
36- break;
37- }
38- case PROPERTY_TYPE_INT: {
39- /* Take the string and convert it to an integer */
40- indicate_listener_get_property_int_cb cb = (indicate_listener_get_property_int_cb)get_property_data->cb;
41- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, g_variant_get_int32(value), get_property_data->data);
42- break;
43- }
44- case PROPERTY_TYPE_BOOL: {
45- /* Check to see if it's 'true', if not assume that
46- it's false */
47- indicate_listener_get_property_bool_cb cb = (indicate_listener_get_property_bool_cb)get_property_data->cb;
48- cb(get_property_data->listener, get_property_data->server, get_property_data->indicator, get_property_data->property, g_variant_get_boolean(value), get_property_data->data);
49- break;
50- }
51- }
52-
53- cleanup:
54+ } else {
55+
56+ GVariant * value = g_variant_get_child_value(retvalue, 0);
57+ if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT)) {
58+ GVariant * tmp = g_variant_get_variant(value);
59+ g_variant_unref (value);
60+ value = tmp;
61+ }
62+
63+ switch (get_property_data->type) {
64+ case PROPERTY_TYPE_VARIANT: {
65+ /* Just pass the GVariant along. */
66+ indicate_listener_get_property_variant_cb cb =(indicate_listener_get_property_variant_cb)get_property_data->cb;
67+ cb(get_property_data->listener,
68+ get_property_data->server,
69+ get_property_data->indicator,
70+ get_property_data->property,
71+ value,
72+ get_property_data->data);
73+ break;
74+ }
75+ case PROPERTY_TYPE_STRING: {
76+ /* Just pass the string along. */
77+ indicate_listener_get_property_cb cb = (indicate_listener_get_property_cb)get_property_data->cb;
78+ cb(get_property_data->listener,
79+ get_property_data->server,
80+ get_property_data->indicator,
81+ get_property_data->property,
82+ g_variant_get_string(value, NULL),
83+ get_property_data->data);
84+ break;
85+ }
86+ case PROPERTY_TYPE_TIME: {
87+ /* Convert it to a time val */
88+ indicate_listener_get_property_time_cb cb = (indicate_listener_get_property_time_cb)get_property_data->cb;
89+ GTimeVal time;
90+ if (g_time_val_from_iso8601(g_variant_get_string(value, NULL), &time)) {
91+ cb(get_property_data->listener,
92+ get_property_data->server,
93+ get_property_data->indicator,
94+ get_property_data->property,
95+ &time,
96+ get_property_data->data);
97+ }
98+ break;
99+ }
100+ case PROPERTY_TYPE_INT: {
101+ /* Take the string and convert it to an integer */
102+ indicate_listener_get_property_int_cb cb = (indicate_listener_get_property_int_cb)get_property_data->cb;
103+ cb(get_property_data->listener,
104+ get_property_data->server,
105+ get_property_data->indicator,
106+ get_property_data->property,
107+ g_variant_get_int32(value),
108+ get_property_data->data);
109+ break;
110+ }
111+ case PROPERTY_TYPE_BOOL: {
112+ /* Check to see if it's 'true', if not assume that
113+ it's false */
114+ indicate_listener_get_property_bool_cb cb = (indicate_listener_get_property_bool_cb)get_property_data->cb;
115+ cb(get_property_data->listener,
116+ get_property_data->server,
117+ get_property_data->indicator,
118+ get_property_data->property,
119+ g_variant_get_boolean(value),
120+ get_property_data->data);
121+ break;
122+ }
123+ }
124+
125+ g_variant_unref (value);
126+ }
127+
128 if (retvalue != NULL) {
129 g_variant_unref(retvalue);
130 }

Subscribers

People subscribed via source and target branches