[libgda] GdaHolder: fix memory leak at set value
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] GdaHolder: fix memory leak at set value
- Date: Mon, 22 Apr 2019 21:16:07 +0000 (UTC)
commit edfa627502e546e5182a0fc4676dc488ff31cf2b
Author: Daniel Espinosa <esodan gmail com>
Date: Mon Apr 22 15:07:03 2019 -0500
GdaHolder: fix memory leak at set value
Changed a warning to an error message.
libgda/gda-holder.c | 32 +++++++++++++++++---------------
libgda/gda-holder.h | 3 ++-
2 files changed, 19 insertions(+), 16 deletions(-)
---
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index 39e63321a..7a11ea05c 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -997,19 +997,22 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
*/
if (!priv->is_freeable) {
gda_holder_unlock ((GdaLockable*) holder);
- g_warning (_("Can't use this method to set value because there is already a static value"));
+ g_set_error (error, GDA_HOLDER_ERROR, GDA_HOLDER_VALUE_CHANGE_ERROR,
+ (_("Can't use this method to set value because there is already a static value")));
return FALSE;
}
+ new_value = value;
// If value's type is compatible to current holder's value's type transform it
if (value && priv->g_type != G_VALUE_TYPE (value)
&& g_value_type_transformable (G_VALUE_TYPE (value), priv->g_type))
{
new_value = gda_value_new (priv->g_type);
g_value_transform (value, new_value);
- if (!do_copy && value)
- gda_value_free (value);
- } else {
- new_value = value;
+ }
+ else {
+ if (do_copy && value != NULL) {
+ new_value = gda_value_copy (value);
+ }
}
/* holder will be changed? */
newnull = !new_value || GDA_VALUE_HOLDS_NULL (new_value);
@@ -1025,7 +1028,7 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
/* holder's validity */
newvalid = TRUE;
if (newnull && priv->not_null) {
- g_set_error (error, GDA_HOLDER_ERROR, GDA_HOLDER_VALUE_NULL_ERROR,
+ g_set_error (error, GDA_HOLDER_ERROR, GDA_HOLDER_VALUE_NULL_ERROR,
_("(%s): Holder does not allow NULL values"),
priv->id);
newvalid = FALSE;
@@ -1056,7 +1059,7 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
/* end of procedure if the value has not been changed, after calculating the holder's validity */
if (!changed) {
- if (!do_copy && new_value)
+ if (new_value)
gda_value_free (new_value);
priv->invalid_forced = FALSE;
if (priv->invalid_error) {
@@ -1079,7 +1082,7 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
lerror->message);
#endif
g_propagate_error (error, lerror);
- if (!do_copy)
+ if (new_value)
gda_value_free (new_value);
gda_holder_unlock ((GdaLockable*) holder);
return FALSE;
@@ -1113,7 +1116,10 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
holder, priv->full_bind, priv->full_bind);
#endif
gda_holder_unlock ((GdaLockable*) holder);
- return real_gda_holder_set_value (priv->full_bind, new_value, do_copy, error);
+ gboolean ret = real_gda_holder_set_value (priv->full_bind, new_value, do_copy, error);
+ if (new_value)
+ gda_value_free (new_value);
+ return ret;
}
else {
if (priv->value) {
@@ -1123,13 +1129,9 @@ real_gda_holder_set_value (GdaHolder *holder, GValue *value, gboolean do_copy, G
if (new_value) {
if (newvalid) {
- if (do_copy)
- priv->value = gda_value_copy (new_value);
- else
- priv->value = new_value;
+ priv->value = gda_value_copy (new_value);
}
- else if (!do_copy)
- gda_value_free (new_value);
+ gda_value_free (new_value);
}
gda_holder_unlock ((GdaLockable*) holder);
diff --git a/libgda/gda-holder.h b/libgda/gda-holder.h
index ff4ce3dc8..5da6fcfb1 100644
--- a/libgda/gda-holder.h
+++ b/libgda/gda-holder.h
@@ -35,7 +35,8 @@ extern GQuark gda_holder_error_quark (void);
typedef enum {
GDA_HOLDER_STRING_CONVERSION_ERROR,
GDA_HOLDER_VALUE_TYPE_ERROR,
- GDA_HOLDER_VALUE_NULL_ERROR
+ GDA_HOLDER_VALUE_NULL_ERROR,
+ GDA_HOLDER_VALUE_CHANGE_ERROR
} GdaHolderError;
#define GDA_TYPE_HOLDER (gda_holder_get_type())
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]