[or-cvs] Fix memory leaks in directory parsing

Nick Mathewson nickm at seul.org
Thu Aug 28 04:22:11 UTC 2003


Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv890/src/or

Modified Files:
	routers.c test.c 
Log Message:
Fix memory leaks in directory parsing

Index: routers.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routers.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- routers.c	27 Aug 2003 22:42:10 -0000	1.42
+++ routers.c	28 Aug 2003 04:21:51 -0000	1.43
@@ -150,6 +150,8 @@
     free(router->address);
   if (router->pkey)
     crypto_free_pk_env(router->pkey);
+  if (router->signing_pkey)
+    crypto_free_pk_env(router->signing_pkey);
   e = router->exit_policy;
   while (e) {
     etmp = e->next;
@@ -285,6 +287,25 @@
   } val;
 };
 
+/* Free any malloced resources allocated for a token.  Don't call this if
+   you inherit the reference to those resources.
+ */
+static void
+router_release_token(directory_token_t *tok)
+{
+  switch (tok->tp) 
+    {
+    case _SIGNATURE:
+      free(tok->val.signature);
+      break;
+    case _PUBLIC_KEY:
+      crypto_free_pk_env(tok->val.public_key);
+      break;
+    default:
+      break;
+    }
+}
+
 static int
 _router_get_next_token(char **s, directory_token_t *tok) {
   char *next;
@@ -568,6 +589,7 @@
 #define TOK_IS(type,name)                                               \
   do {                                                                  \
     if (tok.tp != type) {                                               \
+      router_release_token(&tok);                                       \
       log(LOG_ERR, "Error reading directory: expected %s", name);       \
       return -1;                                                        \
     } } while(0)
@@ -711,8 +733,10 @@
   routerinfo_t *router;
   if (router_get_next_token(s, &tok)) return NULL;
   router = router_get_entry_from_string_tok(s, &tok);
-  if (tok.tp != _EOF)
+  if (tok.tp != _EOF) {
+    router_release_token(&tok);
     return NULL;
+  }
   return router;
 }
 
@@ -732,6 +756,7 @@
 #define ARGS tok->val.cmd.args
 
   if (tok->tp != K_ROUTER) {
+    router_release_token(tok);
     log(LOG_ERR,"router_get_entry_from_string(): Entry does not start with \"router\"");
     return NULL;
   }
@@ -775,7 +800,7 @@
     router->or_port, router->ap_port, router->dir_port, router->bandwidth);
 
   NEXT_TOKEN();
-  if (tok->tp != _PUBLIC_KEY) { 
+  if (tok->tp != _PUBLIC_KEY) {
     log(LOG_ERR,"router_get_entry_from_string(): Missing public key");
     goto err;
   } /* Check key length */
@@ -800,10 +825,13 @@
   return router;
 
  err:
+  router_release_token(tok); 
   if(router->address)
     free(router->address);
   if(router->pkey)
     crypto_free_pk_env(router->pkey);
+  if(router->signing_pkey)
+    crypto_free_pk_env(router->signing_pkey);
   router_free_exit_policy(router);
   free(router);
   return NULL;

Index: test.c
===================================================================
RCS file: /home/or/cvsroot/src/or/test.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- test.c	27 Aug 2003 22:42:10 -0000	1.35
+++ test.c	28 Aug 2003 04:21:57 -0000	1.36
@@ -539,7 +539,7 @@
                                                     &pk1_str_len));
   test_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str, 
                                                     &pk2_str_len));
-  strcpy(buf2, "router testaddr1.foo.bar 9000 9001 9002 9003 1000\n");
+  strcpy(buf2, "router testaddr1.foo.bar 9000 9002 9003 1000\n");
   strcat(buf2, pk1_str);
   strcat(buf2, "\n");
   
@@ -559,7 +559,7 @@
   test_assert(rp1->signing_pkey == NULL);
   test_assert(rp1->exit_policy == NULL);
 
-  strcpy(buf2, "router tor.tor.tor 9005 0 0 0 3000\n");
+  strcpy(buf2, "router tor.tor.tor 9005 0 0 3000\n");
   strcat(buf2, pk2_str);
   strcat(buf2, "signing-key\n");
   strcat(buf2, pk1_str);



More information about the tor-commits mailing list