Browse Source

Handle empty/zero length encoded intro points more gracefully.

In theory these should never the triggered as the only caller now
validates the parameters before this routine gets called.
Yawning Angel 10 years ago
parent
commit
dc3cb00080
1 changed files with 9 additions and 5 deletions
  1. 9 5
      src/or/routerparse.c

+ 9 - 5
src/or/routerparse.c

@@ -4928,7 +4928,7 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed,
                                size_t intro_points_encoded_size)
                                size_t intro_points_encoded_size)
 {
 {
   const char *current_ipo, *end_of_intro_points;
   const char *current_ipo, *end_of_intro_points;
-  smartlist_t *tokens;
+  smartlist_t *tokens = NULL;
   directory_token_t *tok;
   directory_token_t *tok;
   rend_intro_point_t *intro;
   rend_intro_point_t *intro;
   extend_info_t *info;
   extend_info_t *info;
@@ -4937,8 +4937,10 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed,
   tor_assert(parsed);
   tor_assert(parsed);
   /** Function may only be invoked once. */
   /** Function may only be invoked once. */
   tor_assert(!parsed->intro_nodes);
   tor_assert(!parsed->intro_nodes);
-  tor_assert(intro_points_encoded);
-  tor_assert(intro_points_encoded_size > 0);
+  if (!intro_points_encoded || intro_points_encoded_size == 0) {
+    log_warn(LD_REND, "Empty or zero size introduction point list");
+    goto err;
+  }
   /* Consider one intro point after the other. */
   /* Consider one intro point after the other. */
   current_ipo = intro_points_encoded;
   current_ipo = intro_points_encoded;
   end_of_intro_points = intro_points_encoded + intro_points_encoded_size;
   end_of_intro_points = intro_points_encoded + intro_points_encoded_size;
@@ -5042,8 +5044,10 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed,
 
 
  done:
  done:
   /* Free tokens and clear token list. */
   /* Free tokens and clear token list. */
-  SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
-  smartlist_free(tokens);
+  if (tokens) {
+    SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t));
+    smartlist_free(tokens);
+  }
   if (area)
   if (area)
     memarea_drop_all(area);
     memarea_drop_all(area);