Bug 632362 - Unable to create "reversing transaction" again after it is removed

From leaking references in g_object_get because both g_object_get
and g_value_set_object ref the object, which is only unreffed once.
Using g_value_take_object() instead prevents the double-ref.

BP

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23192 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
John Ralls 2013-09-24 20:11:24 +00:00
parent 378a419f8d
commit 84e4edcb67
15 changed files with 116 additions and 29 deletions

View File

@ -268,6 +268,12 @@ gnc_account_finalize(GObject* acctp)
G_OBJECT_CLASS(gnc_account_parent_class)->finalize(acctp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_account_get_property (GObject *object,
guint prop_id,
@ -306,7 +312,7 @@ gnc_account_get_property (GObject *object,
g_value_set_int(value, priv->type);
break;
case PROP_COMMODITY:
g_value_set_object(value, priv->commodity);
g_value_take_object(value, priv->commodity);
break;
case PROP_COMMODITY_SCU:
g_value_set_int(value, priv->commodity_scu);

View File

@ -92,6 +92,12 @@ gnc_schedxaction_finalize(GObject* sxp)
G_OBJECT_CLASS(gnc_schedxaction_parent_class)->finalize(sxp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_schedxaction_get_property (GObject *object,
guint prop_id,
@ -148,7 +154,7 @@ gnc_schedxaction_get_property (GObject *object,
g_value_set_int(value, sx->instance_num);
break;
case PROP_TEMPLATE_ACCOUNT:
g_value_set_object(value, sx->template_acct);
g_value_take_object(value, sx->template_acct);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

View File

@ -113,7 +113,12 @@ gnc_split_finalize(GObject* splitp)
{
G_OBJECT_CLASS(gnc_split_parent_class)->finalize(splitp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_split_get_property(GObject *object,
guint prop_id,
@ -143,13 +148,13 @@ gnc_split_get_property(GObject *object,
g_value_set_boxed(value, &split->date_reconciled);
break;
case PROP_TX:
g_value_set_object(value, split->parent);
g_value_take_object(value, split->parent);
break;
case PROP_ACCOUNT:
g_value_set_object(value, split->acc);
g_value_take_object(value, split->acc);
break;
case PROP_LOT:
g_value_set_object(value, split->lot);
g_value_take_object(value, split->lot);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

View File

@ -289,6 +289,12 @@ gnc_transaction_finalize(GObject* txnp)
G_OBJECT_CLASS(gnc_transaction_parent_class)->finalize(txnp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_transaction_get_property(GObject* object,
guint prop_id,
@ -309,7 +315,7 @@ gnc_transaction_get_property(GObject* object,
g_value_set_string(value, tx->description);
break;
case PROP_CURRENCY:
g_value_set_object(value, tx->common_currency);
g_value_take_object(value, tx->common_currency);
break;
case PROP_POST_DATE:
g_value_set_boxed(value, &tx->date_posted);

View File

@ -626,7 +626,12 @@ gnc_commodity_finalize(GObject* comp)
{
G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_commodity_get_property (GObject *object,
guint prop_id,
@ -643,7 +648,7 @@ gnc_commodity_get_property (GObject *object,
switch (prop_id)
{
case PROP_NAMESPACE:
g_value_set_object(value, priv->namespace);
g_value_take_object(value, priv->namespace);
break;
case PROP_FULL_NAME:
g_value_set_string(value, priv->fullname);

View File

@ -73,6 +73,12 @@ gnc_price_finalize(GObject* pricep)
G_OBJECT_CLASS(gnc_price_parent_class)->finalize(pricep);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_price_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
{
@ -93,10 +99,10 @@ gnc_price_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec
g_value_set_boxed(value, &price->value);
break;
case PROP_COMMODITY:
g_value_set_object(value, price->commodity);
g_value_take_object(value, price->commodity);
break;
case PROP_CURRENCY:
g_value_set_object(value, price->currency);
g_value_take_object(value, price->currency);
break;
case PROP_DATE:
g_value_set_boxed(value, &price->tmspec);

View File

@ -111,6 +111,12 @@ gnc_employee_finalize(GObject* empp)
G_OBJECT_CLASS(gnc_employee_parent_class)->finalize(empp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_employee_get_property (GObject *object,
guint prop_id,
@ -137,13 +143,13 @@ gnc_employee_get_property (GObject *object,
g_value_set_string(value, emp->language);
break;
case PROP_CURRENCY:
g_value_set_object(value, emp->currency);
g_value_take_object(value, emp->currency);
break;
case PROP_ACL:
g_value_set_string(value, emp->acl);
break;
case PROP_ADDRESS:
g_value_set_object(value, emp->addr);
g_value_take_object(value, emp->addr);
break;
case PROP_WORKDAY:
g_value_set_boxed(value, &emp->workday);
@ -152,7 +158,7 @@ gnc_employee_get_property (GObject *object,
g_value_set_boxed(value, &emp->rate);
break;
case PROP_CCARD:
g_value_set_object(value, emp->ccard_acc);
g_value_take_object(value, emp->ccard_acc);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

View File

@ -121,6 +121,12 @@ gnc_vendor_finalize(GObject* vendorp)
G_OBJECT_CLASS(gnc_vendor_parent_class)->finalize(vendorp);
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_vendor_get_property (GObject *object,
guint prop_id,
@ -144,7 +150,7 @@ gnc_vendor_get_property (GObject *object,
g_value_set_string(value, vendor->notes);
break;
case PROP_CURRENCY:
g_value_set_object(value, vendor->currency);
g_value_take_object(value, vendor->currency);
break;
case PROP_ACTIVE:
g_value_set_boolean(value, vendor->active);
@ -153,13 +159,13 @@ gnc_vendor_get_property (GObject *object,
g_value_set_boolean(value, vendor->taxtable_override);
break;
case PROP_BILLTERMS:
g_value_set_object(value, vendor->terms);
g_value_take_object(value, vendor->terms);
break;
case PROP_TAXTABLE:
g_value_set_object(value, vendor->taxtable);
g_value_take_object(value, vendor->taxtable);
break;
case PROP_ADDRESS:
g_value_set_object(value, vendor->addr);
g_value_take_object(value, vendor->addr);
break;
case PROP_TAX_INCLUDED:
g_value_set_int(value, vendor->taxincluded);

View File

@ -277,7 +277,12 @@ gctt_set_property (GObject *object,
}
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gctt_get_property (GObject *object,
guint param_id,
@ -289,7 +294,7 @@ gctt_get_property (GObject *object,
switch (param_id) {
case PROP_MODEL:
g_value_set_object (value, priv->model);
g_value_take_object (value, priv->model);
break;
case PROP_ACTIVE:

View File

@ -605,6 +605,12 @@ gnc_plugin_page_finalize (GObject *object)
*
* @param pspec A pointer to the meta data that described the property
* being retrieved. */
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_plugin_page_get_property (GObject *object,
guint prop_id,
@ -639,10 +645,10 @@ gnc_plugin_page_get_property (GObject *object,
g_value_set_string (value, priv->ui_description);
break;
case PROP_UI_MERGE:
g_value_set_object (value, priv->ui_merge);
g_value_take_object (value, priv->ui_merge);
break;
case PROP_ACTION_GROUP:
g_value_set_object (value, priv->action_group);
g_value_take_object (value, priv->action_group);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);

View File

@ -353,6 +353,12 @@ qof_instance_finalize_real (GObject *instp)
priv->dirty = FALSE;
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
qof_instance_get_property (GObject *object,
guint prop_id,
@ -376,7 +382,7 @@ qof_instance_get_property (GObject *object,
g_value_set_pointer(value, priv->collection);
break;
case PROP_BOOK:
g_value_set_object(value, priv->book);
g_value_take_object(value, priv->book);
break;
case PROP_KVP_DATA:
g_value_set_pointer(value, inst->kvp_data);

View File

@ -465,6 +465,12 @@ gnucash_cursor_set_property (GObject *object,
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnucash_cursor_get_property (GObject *object,
guint prop_id,
@ -476,10 +482,10 @@ gnucash_cursor_get_property (GObject *object,
switch (prop_id)
{
case PROP_SHEET:
g_value_set_object (value, cursor->sheet);
g_value_take_object (value, cursor->sheet);
break;
case PROP_GRID:
g_value_set_object (value, cursor->grid);
g_value_take_object (value, cursor->grid);
break;
default:
break;

View File

@ -822,6 +822,12 @@ gnucash_grid_set_property (GObject *object,
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnucash_grid_get_property (GObject *object,
guint prop_id,
@ -833,7 +839,7 @@ gnucash_grid_get_property (GObject *object,
switch (prop_id)
{
case PROP_SHEET:
g_value_set_object (value, grid->sheet);
g_value_take_object (value, grid->sheet);
break;
default:
break;

View File

@ -595,6 +595,12 @@ gnc_header_event (GnomeCanvasItem *item, GdkEvent *event)
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_header_get_property (GObject *object,
guint param_id,
@ -606,7 +612,7 @@ gnc_header_get_property (GObject *object,
switch (param_id)
{
case PROP_SHEET:
g_value_set_object (value, header->sheet);
g_value_take_object (value, header->sheet);
break;
case PROP_CURSOR_NAME:
g_value_set_string (value, header->cursor_name);

View File

@ -1055,6 +1055,12 @@ disconnect_popup_toggle_signals (GncItemEdit *item_edit)
item_edit->popup_toggle.signals_connected = FALSE;
}
/* Note that g_value_set_object() refs the object, as does
* g_object_get(). But g_object_get() only unrefs once when it disgorges
* the object, leaving an unbalanced ref, which leaks. So instead of
* using g_value_set_object(), use g_value_take_object() which doesn't
* ref the object when used in get_property().
*/
static void
gnc_item_edit_get_property (GObject *object,
guint param_id,
@ -1066,10 +1072,10 @@ gnc_item_edit_get_property (GObject *object,
switch (param_id)
{
case PROP_SHEET:
g_value_set_object (value, item_edit->sheet);
g_value_take_object (value, item_edit->sheet);
break;
case PROP_EDITOR:
g_value_set_object (value, item_edit->editor);
g_value_take_object (value, item_edit->editor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);