aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2014-12-15 08:16:47 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-12-15 08:16:47 +0100
commit032ba5022655d1e66ddad3f568187bc46af66bd6 (patch)
tree69ca4b2f5bcab6b161f73abd045e8740f1f39506 /src
parent1aab71ce61ea84cb15ed9a83ac4b2c5d22e92501 (diff)
downloadsciteco-032ba5022655d1e66ddad3f568187bc46af66bd6.tar.gz
always free glib's GError structures
* when throwing GlibError(), this is taken care of automatically. * fixes a memleak since there may be resources associated with the GError.
Diffstat (limited to 'src')
-rw-r--r--src/error.h12
-rw-r--r--src/main.cpp1
-rw-r--r--src/spawn.cpp6
3 files changed, 17 insertions, 2 deletions
diff --git a/src/error.h b/src/error.h
index 9029b86..3eb584c 100644
--- a/src/error.h
+++ b/src/error.h
@@ -147,8 +147,16 @@ public:
class GlibError : public Error {
public:
- GlibError(const GError *gerror)
- : Error("%s", gerror->message) {}
+ /**
+ * Construct error for glib's GError.
+ * Ownership of the error's resources is passed
+ * the GlibError object.
+ */
+ GlibError(GError *gerror)
+ : Error("%s", gerror->message)
+ {
+ g_error_free(gerror);
+ }
};
class SyntaxError : public Error {
diff --git a/src/main.cpp b/src/main.cpp
index 40b36cb..067e1b2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -161,6 +161,7 @@ process_options(int &argc, char **&argv)
if (!g_option_context_parse(options, &argc, &argv, &gerror)) {
g_fprintf(stderr, "Option parsing failed: %s\n",
gerror->message);
+ g_error_free(gerror);
exit(EXIT_FAILURE);
}
diff --git a/src/spawn.cpp b/src/spawn.cpp
index 7b7c10f..f5b7f2f 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -219,6 +219,8 @@ StateExecuteCommand::~StateExecuteCommand()
{
g_main_loop_unref(ctx.mainloop);
g_main_context_unref(ctx.mainctx);
+ if (ctx.error)
+ g_error_free(ctx.error);
}
void
@@ -414,6 +416,10 @@ gerror:
else
expressions.push(FAILURE);
undo.push_var(register_argument) = NULL;
+
+ g_error_free(ctx.error);
+ ctx.error = NULL;
+
return &States::start;
}