Skip to content

Commit d4b7498

Browse files
committed
fix/segfault: potential duplicate free, closes #237
1 parent 56750f1 commit d4b7498

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

src/log.c

+35-10
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ struct _LogPrivate
1010

1111
G_DEFINE_TYPE (Log, log, GTK_TYPE_LIST_STORE);
1212

13-
static void log_finalize (GObject *object) { G_OBJECT_CLASS (log_parent_class)->finalize (object); }
13+
static void log_finalize (GObject *object) {
14+
G_OBJECT_CLASS (log_parent_class)->finalize (object);
15+
}
1416

1517
static void log_class_init (LogClass *klass)
1618
{
@@ -30,20 +32,43 @@ static void log_init (Log *self)
3032

3133
Log *log_new () { return g_object_new (LOG_TYPE, NULL); }
3234

35+
36+
37+
static GRegex* splitter() {
38+
GError* error = NULL;
39+
GRegex* regex = g_regex_new("[\\r\\n]*(.*?)[\\n$]+", 0,0, &error);
40+
g_assert(error == NULL);
41+
g_assert(regex != NULL);
42+
return regex;
43+
}
44+
45+
3346
/**
3447
* trim only newlines
3548
*/
36-
gchar *log_append_trim_message(const gchar *string) {
37-
if (string == NULL)
49+
gchar *log_append_trim_message(const gchar *str) {
50+
// skip empty or null strings right away
51+
if (str == NULL || str[0] == '\0') {
3852
return NULL;
39-
gchar **array = g_regex_split_simple("[\\r\\n]*(.*?)[\\n$]+", string, 0, 0);
40-
gchar *ret_val = g_strdup(array[0]);
41-
g_strfreev(array);
42-
if (*ret_val == 0) {
43-
g_free(ret_val);
44-
ret_val = NULL;
4553
}
46-
return ret_val;
54+
// TODO this is inefficient
55+
56+
gchar **array = g_regex_split(regex, str);
57+
gchar *cloned = NULL;
58+
if (array != NULL && array[0] != NULL) {
59+
cloned = g_strdup(array[0]);
60+
if (array[0] == str) {
61+
// avoid duplicate free in case not matching anything
62+
array[0] = NULL;
63+
}
64+
g_strfreev(array);
65+
}
66+
// after split might be length zer0 too, skip those
67+
if (cloned != NULL && (cloned[0] == '\0') {
68+
g_free(cloned);
69+
cloned = NULL;
70+
}
71+
return cloned;
4772
}
4873

4974
/**

0 commit comments

Comments
 (0)