1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
From c97f144231afbeb4215659d5c685fdf1e3fe5612 Mon Sep 17 00:00:00 2001
From: xaizek <xaizek@posteo.net>
Date: Sat, 8 Jul 2023 15:02:37 +0300
Subject: [PATCH] Fix running tests with musl libc
Thanks to Henrik Holst (a.k.a. hholst80).
---
Upstream commit https://github.com/vifm/vifm/commit/c97f144231afbeb4215659d5c685fdf1e3fe5612
diff --git a/src/filelist.c b/src/filelist.c
index 28d26c69f..a7121f238 100644
--- a/src/filelist.c
+++ b/src/filelist.c
@@ -329,7 +329,11 @@ flist_free_view(view_t *view)
modview_info_free(view->vi);
view->vi = NULL;
- regfree(&view->primary_group);
+ if(view->primary_group_set)
+ {
+ regfree(&view->primary_group);
+ view->primary_group_set = 0;
+ }
marks_clear_view(view);
diff --git a/src/opt_handlers.c b/src/opt_handlers.c
index 5d1c000b0..9905b2b7f 100644
--- a/src/opt_handlers.c
+++ b/src/opt_handlers.c
@@ -3301,9 +3301,13 @@ set_sortgroups(view_t *view, char **opt, char value[])
{
if(scope == OPT_LOCAL)
{
- regfree(&view->primary_group);
+ if(view->primary_group_set)
+ {
+ regfree(&view->primary_group);
+ }
(void)regexp_compile(&view->primary_group, first,
REG_EXTENDED | REG_ICASE);
+ view->primary_group_set = 1;
}
free(first);
}
diff --git a/src/ui/fileview.c b/src/ui/fileview.c
index 11c80fe8b..ef5f422be 100644
--- a/src/ui/fileview.c
+++ b/src/ui/fileview.c
@@ -253,6 +253,7 @@ fview_init(view_t *view)
view->sort_groups_g = strdup("");
(void)regexp_compile(&view->primary_group, view->sort_groups,
REG_EXTENDED | REG_ICASE);
+ view->primary_group_set = 1;
view->preview_prg = strdup("");
view->preview_prg_g = strdup("");
diff --git a/src/ui/ui.h b/src/ui/ui.h
index c9fee0782..886eb9d38 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -449,6 +449,9 @@ struct view_t
char *sort_groups, *sort_groups_g;
/* Primary group of sort_groups (not sort_groups_g) in compiled form. */
regex_t primary_group;
+ /* Indicates that primary_group was initialized, which is used to avoid
+ * freeing uninitialized data or freeing it twice. */
+ int primary_group_set;
int history_num; /* Number of used history elements. */
int history_pos; /* Current position in history. */
diff --git a/tests/misc/sort.c b/tests/misc/sort.c
index 9938414b5..3db71db5b 100644
--- a/tests/misc/sort.c
+++ b/tests/misc/sort.c
@@ -409,8 +409,13 @@ TEST(groups_sorting_works)
lwin.dir_entry[6].origin = lwin.curr_dir;
update_string(&lwin.sort_groups, "-(done|todo).*");
+ if(lwin.primary_group_set)
+ {
+ regfree(&lwin.primary_group);
+ }
(void)regcomp(&lwin.primary_group, "-(done|todo).*",
REG_EXTENDED | REG_ICASE);
+ lwin.primary_group_set = 1;
/* Ascending sorting. */
@@ -437,15 +442,17 @@ TEST(groups_sorting_works)
assert_string_equal("11-todo-publish", lwin.dir_entry[4].name);
assert_string_equal("1-done", lwin.dir_entry[5].name);
assert_string_equal("3-done", lwin.dir_entry[6].name);
-
- regfree(&lwin.primary_group);
- update_string(&lwin.sort_groups, NULL);
}
TEST(global_groups_sorts_entries_list)
{
update_string(&lwin.sort_groups_g, "([0-9])");
+ if(lwin.primary_group_set)
+ {
+ regfree(&lwin.primary_group);
+ }
(void)regcomp(&lwin.primary_group, "([a-z])", REG_EXTENDED | REG_ICASE);
+ lwin.primary_group_set = 1;
dir_entry_t entry_list[] = { { .name = "a1" }, { .name = "b0" } };
entries_t entries = { entry_list, 2 };
diff --git a/tests/test-support/test-utils.c b/tests/test-support/test-utils.c
index 932bdc9c9..e3d9ba694 100644
--- a/tests/test-support/test-utils.c
+++ b/tests/test-support/test-utils.c
@@ -32,6 +32,7 @@
#include "../../src/utils/macros.h"
#include "../../src/utils/matcher.h"
#include "../../src/utils/path.h"
+#include "../../src/utils/regexp.h"
#include "../../src/utils/str.h"
#include "../../src/utils/string_array.h"
#include "../../src/utils/utils.h"
@@ -254,6 +255,10 @@ view_setup(view_t *view)
view_set_sort(view->sort, SK_BY_NAME, SK_NONE);
view_set_sort(view->sort_g, SK_BY_NAME, SK_NONE);
+ /* The code assumes that this field is initialized. */
+ assert_success(regexp_compile(&view->primary_group, "", REG_ICASE));
+ view->primary_group_set = 1;
+
view->custom.entry_count = 0;
view->custom.entries = NULL;
|