]> git.sur5r.net Git - i3/i3/commitdiff
Fix multiple memory leaks with regular expressions.
authorIngo Bürk <ingo.buerk@tngtech.com>
Wed, 28 Oct 2015 13:39:23 +0000 (14:39 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 28 Oct 2015 20:56:53 +0000 (21:56 +0100)
src/config_directives.c
src/manage.c
src/match.c
src/regex.c

index cd0432fe06c31b6e2b068f416c1cebc77a30fba2..fdfc1c7dcc490de18d8d487fc7362496afc16a12 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 67054dae42960035d4e7b6e351d917b94bd3efed..2cdf4f4591798ec169c4f424c1754ac4998d4006 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;
     }
@@ -334,11 +329,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;
     }
@@ -357,6 +354,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);
 }
 
 /*