Skip to content

Commit ae184bc

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

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

src/log.c

+40-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,48 @@ 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+
55+
56+
static GOnce once = G_ONCE_INIT;
57+
58+
g_once (&once, (GThreadFunc)splitter, NULL);
59+
60+
61+
gchar **array = g_regex_split(once.retval, str, G_REGEX_MATCH_NOTEMPTY);
62+
gchar *cloned = NULL;
63+
if (array != NULL && array[0] != NULL) {
64+
cloned = g_strdup(array[0]);
65+
if (array[0] == str) {
66+
// avoid duplicate free in case not matching anything
67+
array[0] = NULL;
68+
}
69+
g_strfreev(array);
70+
}
71+
// after split might be length zer0 too, skip those
72+
if ((cloned != NULL) && (cloned[0] == '\0')) {
73+
g_free(cloned);
74+
cloned = NULL;
75+
}
76+
return cloned;
4777
}
4878

4979
/**

wscript

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env python3
22
# encoding: utf-8
33

4-
VERSION = '0.84.41'
4+
VERSION = '0.84.42'
55
APPNAME = 'oregano'
66

77
top = '.'

0 commit comments

Comments
 (0)