Fix multiple memory leaks with regular expressions.
This commit is contained in:
parent
3295e05089
commit
27db61f504
@ -29,6 +29,7 @@ CFGFUN(criteria_init, int _state) {
|
||||
criteria_next_state = _state;
|
||||
|
||||
DLOG("Initializing criteria, current_match = %p, state = %d\n", current_match, _state);
|
||||
match_free(current_match);
|
||||
match_init(current_match);
|
||||
}
|
||||
|
||||
|
@ -294,6 +294,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
|
||||
if (match != NULL && match->insert_where != M_BELOW) {
|
||||
DLOG("Removing match %p from container %p\n", match, nc);
|
||||
TAILQ_REMOVE(&(nc->swallow_head), match, matches);
|
||||
match_free(match);
|
||||
}
|
||||
}
|
||||
|
||||
|
16
src/match.c
16
src/match.c
@ -238,21 +238,13 @@ bool match_matches_window(Match *match, i3Window *window) {
|
||||
*
|
||||
*/
|
||||
void match_free(Match *match) {
|
||||
/* First step: free the regex fields / patterns */
|
||||
regex_free(match->title);
|
||||
regex_free(match->application);
|
||||
regex_free(match->class);
|
||||
regex_free(match->instance);
|
||||
regex_free(match->mark);
|
||||
regex_free(match->window_role);
|
||||
|
||||
/* Second step: free the regex helper struct itself */
|
||||
FREE(match->title);
|
||||
FREE(match->application);
|
||||
FREE(match->class);
|
||||
FREE(match->instance);
|
||||
FREE(match->mark);
|
||||
FREE(match->window_role);
|
||||
regex_free(match->workspace);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -264,16 +256,19 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
|
||||
DLOG("ctype=*%s*, cvalue=*%s*\n", ctype, cvalue);
|
||||
|
||||
if (strcmp(ctype, "class") == 0) {
|
||||
regex_free(match->class);
|
||||
match->class = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(ctype, "instance") == 0) {
|
||||
regex_free(match->instance);
|
||||
match->instance = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(ctype, "window_role") == 0) {
|
||||
regex_free(match->window_role);
|
||||
match->window_role = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
@ -339,11 +334,13 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
|
||||
}
|
||||
|
||||
if (strcmp(ctype, "con_mark") == 0) {
|
||||
regex_free(match->mark);
|
||||
match->mark = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(ctype, "title") == 0) {
|
||||
regex_free(match->title);
|
||||
match->title = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
@ -362,6 +359,7 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
|
||||
}
|
||||
|
||||
if (strcmp(ctype, "workspace") == 0) {
|
||||
regex_free(match->workspace);
|
||||
match->workspace = regex_new(cvalue);
|
||||
return;
|
||||
}
|
||||
|
@ -64,6 +64,7 @@ void regex_free(struct regex *regex) {
|
||||
FREE(regex->pattern);
|
||||
FREE(regex->regex);
|
||||
FREE(regex->extra);
|
||||
FREE(regex);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user