]> git.sur5r.net Git - i3/i3/commitdiff
Fix multiple memory leaks with regular expressions. 2043/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Wed, 28 Oct 2015 13:39:23 +0000 (14:39 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Wed, 28 Oct 2015 13:40:10 +0000 (14:40 +0100)
src/config_directives.c
src/manage.c
src/match.c
src/regex.c

index 960dee5bfdde70f6aaa227f511f2230bb6b57478..20b880ed7f932b566db84ec99ff4e8f298a330a0 100644 (file)
@@ -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);
 }
 
index 5cfe490ec2746ab4540e1dcc597940f991bc33fd..0dec28443906c3a209342d6e0a3cb25d8479e8ee 100644 (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) {
             DLOG("Removing match %p from container %p\n", match, nc);
             TAILQ_REMOVE(&(nc->swallow_head), match, matches);
+            match_free(match);
         }
     }
 
index 8da3c1eaaa1cb05c1780ddc6a0b4b8dc3d5017ad..1cdd478facac621e2d6c4af6a679dae6d7b8329e 100644 (file)
@@ -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;
     }
index 913519bede31d826144bdb7e5272e9c92598d876..24846981fbf16b945c5d7e90a9e4b62c26f2f66e 100644 (file)
@@ -64,6 +64,7 @@ void regex_free(struct regex *regex) {
     FREE(regex->pattern);
     FREE(regex->regex);
     FREE(regex->extra);
+    FREE(regex);
 }
 
 /*