]> Zhao Yanbai Git Server - minix.git/commitdiff
DS: fix regex memory leaks 64/3064/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 24 Aug 2015 10:18:40 +0000 (12:18 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 31 Aug 2015 12:55:18 +0000 (12:55 +0000)
The regcomp(3) calls had no matching regfree(3) calls.

Change-Id: I5250d62e6ab22821aff18bcdc336cb485df6868e

minix/servers/ds/inc.h
minix/servers/ds/store.c

index 946bfafa7901e401ce27de819be21dba2a1b940c..92860304c115e181135cf8e8c52e5fab5992fd3b 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <signal.h>
+#include <assert.h>
 
 #include "proto.h"
 #endif
index e6fb5e10c029a8a123c5208545dd8240a5b285a0..f9d2407ac1df1a418737ed54ab3583f402e591ac 100644 (file)
@@ -26,7 +26,7 @@ static struct data_store *alloc_data_slot(void)
  *===========================================================================*/
 static struct subscription *alloc_sub_slot(void)
 {
-/* Allocate a new subscription slot. */
+/* Return a free subscription slot. */
   int i;
 
   for (i = 0; i < NR_DS_SUBS; i++) {
@@ -37,6 +37,20 @@ static struct subscription *alloc_sub_slot(void)
   return NULL;
 }
 
+/*===========================================================================*
+ *                             free_sub_slot                                *
+ *===========================================================================*/
+static void free_sub_slot(struct subscription *subp)
+{
+/* Clean up a previously successfully) allocated subscription slot. */
+  assert(subp->flags & DSF_IN_USE);
+
+  regfree(&subp->regex);
+  memset(&subp->regex, 0, sizeof(subp->regex));
+
+  subp->flags = 0;
+}
+
 /*===========================================================================*
  *                             lookup_entry                                 *
  *===========================================================================*/
@@ -454,15 +468,18 @@ int do_subscribe(message *m_ptr)
          return ESRCH;
 
   /* See if the owner already has an existing subscription. */
-  if((subp = lookup_sub(owner)) == NULL) {
-       /* The subscription doesn't exist, allocate a new one. */
-       if((subp = alloc_sub_slot()) == NULL)
-               return EAGAIN;
-  } else if(!(m_ptr->m_ds_req.flags & DSF_OVERWRITE)) {
-       /* The subscription exists but we can't overwrite, return error. */
-       return EEXIST;
+  if ((subp = lookup_sub(owner)) != NULL) {
+       /* If a subscription exists but we can't overwrite, return error. */
+       if (!(m_ptr->m_ds_req.flags & DSF_OVERWRITE))
+               return EEXIST;
+       /* Otherwise just free the old one. */
+       free_sub_slot(subp);
   }
 
+  /* Find a free subscription slot. */
+  if ((subp = alloc_sub_slot()) == NULL)
+       return EAGAIN;
+
   /* Copy key name from the caller. Anchor the subscription with "^regexp$" so
    * substrings don't match. The caller will probably not expect this,
    * and the usual case is for a complete match.
@@ -476,6 +493,7 @@ int do_subscribe(message *m_ptr)
   if((e=regcomp(&subp->regex, regex, REG_EXTENDED)) != 0) {
        regerror(e, &subp->regex, errbuf, sizeof(errbuf));
        printf("DS: subscribe: regerror: %s\n", errbuf);
+       memset(&subp->regex, 0, sizeof(subp->regex));
        return EINVAL;
   }
 
@@ -598,7 +616,7 @@ int do_delete(message *m_ptr)
        for (i = 0; i < NR_DS_SUBS; i++) {
                if ((ds_subs[i].flags & DSF_IN_USE)
                        && !strcmp(ds_subs[i].owner, label)) {
-                       ds_subs[i].flags = 0;
+                       free_sub_slot(&ds_subs[i]);
                }
        }