Merge pull request #2043 from Airblader/bug-regex-mem-leak

Fix multiple memory leaks with regular expressions.
This commit is contained in:
Michael Stapelberg 2015-10-28 18:55:26 +01:00
commit b330050df7
4 changed files with 10 additions and 9 deletions

View File

@ -29,6 +29,7 @@ CFGFUN(criteria_init, int _state) {
criteria_next_state = _state; criteria_next_state = _state;
DLOG("Initializing criteria, current_match = %p, state = %d\n", current_match, _state); DLOG("Initializing criteria, current_match = %p, state = %d\n", current_match, _state);
match_free(current_match);
match_init(current_match); match_init(current_match);
} }

View File

@ -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) { if (match != NULL && match->insert_where != M_BELOW) {
DLOG("Removing match %p from container %p\n", match, nc); DLOG("Removing match %p from container %p\n", match, nc);
TAILQ_REMOVE(&(nc->swallow_head), match, matches); TAILQ_REMOVE(&(nc->swallow_head), match, matches);
match_free(match);
} }
} }

View File

@ -238,21 +238,13 @@ bool match_matches_window(Match *match, i3Window *window) {
* *
*/ */
void match_free(Match *match) { void match_free(Match *match) {
/* First step: free the regex fields / patterns */
regex_free(match->title); regex_free(match->title);
regex_free(match->application); regex_free(match->application);
regex_free(match->class); regex_free(match->class);
regex_free(match->instance); regex_free(match->instance);
regex_free(match->mark); regex_free(match->mark);
regex_free(match->window_role); regex_free(match->window_role);
regex_free(match->workspace);
/* 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);
} }
/* /*
@ -264,16 +256,19 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
DLOG("ctype=*%s*, cvalue=*%s*\n", ctype, cvalue); DLOG("ctype=*%s*, cvalue=*%s*\n", ctype, cvalue);
if (strcmp(ctype, "class") == 0) { if (strcmp(ctype, "class") == 0) {
regex_free(match->class);
match->class = regex_new(cvalue); match->class = regex_new(cvalue);
return; return;
} }
if (strcmp(ctype, "instance") == 0) { if (strcmp(ctype, "instance") == 0) {
regex_free(match->instance);
match->instance = regex_new(cvalue); match->instance = regex_new(cvalue);
return; return;
} }
if (strcmp(ctype, "window_role") == 0) { if (strcmp(ctype, "window_role") == 0) {
regex_free(match->window_role);
match->window_role = regex_new(cvalue); match->window_role = regex_new(cvalue);
return; return;
} }
@ -339,11 +334,13 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
} }
if (strcmp(ctype, "con_mark") == 0) { if (strcmp(ctype, "con_mark") == 0) {
regex_free(match->mark);
match->mark = regex_new(cvalue); match->mark = regex_new(cvalue);
return; return;
} }
if (strcmp(ctype, "title") == 0) { if (strcmp(ctype, "title") == 0) {
regex_free(match->title);
match->title = regex_new(cvalue); match->title = regex_new(cvalue);
return; return;
} }
@ -362,6 +359,7 @@ void match_parse_property(Match *match, const char *ctype, const char *cvalue) {
} }
if (strcmp(ctype, "workspace") == 0) { if (strcmp(ctype, "workspace") == 0) {
regex_free(match->workspace);
match->workspace = regex_new(cvalue); match->workspace = regex_new(cvalue);
return; return;
} }

View File

@ -64,6 +64,7 @@ void regex_free(struct regex *regex) {
FREE(regex->pattern); FREE(regex->pattern);
FREE(regex->regex); FREE(regex->regex);
FREE(regex->extra); FREE(regex->extra);
FREE(regex);
} }
/* /*