Commit c42c2b66 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

only choose routers for the onion that are currently connected to us


svn:r72
parent cd0760dd
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -100,8 +100,8 @@ unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, siz
  unsigned int *route = NULL;
  unsigned int oldchoice, choice;
  
  if ( (cw >= 0) && (cw < 1) && (rarray) && (rlen) ) /* valid parameters */
  {
  assert((cw >= 0) && (cw < 1) && (rarray) && (rlen) ); /* valid parameters */

    routelen = chooselen(cw);
    if (routelen == -1)
    {
@@ -110,6 +110,9 @@ unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, siz
    }
    log(LOG_DEBUG,"new_route(): Chosen route length %u.",routelen);

    /* FIXME need to figure out how many routers we can actually choose from.
     * We can get into an infinite loop if there are too few. */
  
    /* allocate memory for the new route */
    route = (unsigned int *)malloc(routelen * sizeof(unsigned int));
    if (!route)
@@ -132,8 +135,11 @@ unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, siz
      choice = choice % (rarray_len);
      log(LOG_DEBUG,"new_route() : Chosen router %u.",choice);
      if (choice == oldchoice ||
        (oldchoice < rarray_len && !pkey_cmp(rarray[choice]->pkey, rarray[oldchoice]->pkey))) {
        /* same router, or router twin. try again. */
        (oldchoice < rarray_len && !pkey_cmp(rarray[choice]->pkey, rarray[oldchoice]->pkey)) ||
        !connection_twin_get_by_addr_port(rarray[choice]->addr, rarray[choice]->or_port)) {
        /* Same router as last choice, or router twin,
         *   or no routers with that key are connected to us.
         * Try again. */
	i--;
	continue;
      }
@@ -143,9 +149,6 @@ unsigned int *new_route(double cw, routerinfo_t **rarray, size_t rarray_len, siz
   
    *rlen = routelen;
    return route;
  } /* valid parameters */
  else /* invalid parameters */
    return NULL;
}

/* creates a new onion from route, stores it and its length into bufp and lenp respectively */