Fix crash when there's no TRANS_READ_ONLY_REASON slot.

Unsetting an empty g_value raises a fatal error, causing tests to fail
in some environments.

g_free() handles NULLs itself, no need to protect it.
This commit is contained in:
John Ralls 2018-09-09 15:02:53 -07:00
parent b2d99615ab
commit a19dcc7bd4

View File

@ -813,8 +813,7 @@ xaccFreeTransaction (Transaction *trans)
/* free up transaction strings */ /* free up transaction strings */
CACHE_REMOVE(trans->num); CACHE_REMOVE(trans->num);
CACHE_REMOVE(trans->description); CACHE_REMOVE(trans->description);
if (trans->readonly_reason) g_free (trans->readonly_reason);
g_free (trans->readonly_reason);
/* Just in case someone looks up freed memory ... */ /* Just in case someone looks up freed memory ... */
trans->num = (char *) 1; trans->num = (char *) 1;
@ -2076,8 +2075,7 @@ void xaccTransClearReadOnly (Transaction *trans)
qof_instance_set_dirty(QOF_INSTANCE(trans)); qof_instance_set_dirty(QOF_INSTANCE(trans));
xaccTransCommitEdit(trans); xaccTransCommitEdit(trans);
if (trans->readonly_reason) g_free (trans->readonly_reason);
g_free (trans->readonly_reason);
trans->readonly_reason = NULL; trans->readonly_reason = NULL;
trans->reason_cache_valid = TRUE; trans->reason_cache_valid = TRUE;
} }
@ -2096,8 +2094,7 @@ xaccTransSetReadOnly (Transaction *trans, const char *reason)
qof_instance_set_dirty(QOF_INSTANCE(trans)); qof_instance_set_dirty(QOF_INSTANCE(trans));
xaccTransCommitEdit(trans); xaccTransCommitEdit(trans);
if (trans->readonly_reason) g_free (trans->readonly_reason);
g_free (trans->readonly_reason);
trans->readonly_reason = g_strdup (reason); trans->readonly_reason = g_strdup (reason);
trans->reason_cache_valid = TRUE; trans->reason_cache_valid = TRUE;
} }
@ -2467,15 +2464,16 @@ xaccTransGetReadOnly (Transaction *trans)
qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON); qof_instance_get_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_READ_ONLY_REASON);
/* Clear possible old cache value first */ /* Clear possible old cache value first */
if (trans->readonly_reason) g_free (trans->readonly_reason);
g_free (trans->readonly_reason);
trans->readonly_reason = NULL; trans->readonly_reason = NULL;
/* Then set the new one */ /* Then set the new one */
if (G_VALUE_HOLDS_STRING (&v)) if (G_VALUE_HOLDS_STRING (&v))
{
trans->readonly_reason = g_value_dup_string (&v); trans->readonly_reason = g_value_dup_string (&v);
g_value_unset (&v); g_value_unset (&v);
trans->reason_cache_valid = TRUE; trans->reason_cache_valid = TRUE;
}
} }
return trans->readonly_reason; return trans->readonly_reason;
} }