chiark / gitweb /
site: Fix bugs when resolver request submission fails
[secnet.git] / site.c
diff --git a/site.c b/site.c
index 1d8c77788d532968f8cae245450fa16e2be46f3f..b6d05af74e339fc889dd04b43f055c21e1a1d85d 100644 (file)
--- a/site.c
+++ b/site.c
@@ -347,9 +347,27 @@ static void logtimeout(struct site *st, const char *fmt, ...)
 FORMAT(printf,2,3);
 static void logtimeout(struct site *st, const char *fmt, ...)
 {
+    uint32_t class=event_log_priority(st,LOG_SETUP_TIMEOUT);
+    if (!class)
+       return;
+
     va_list ap;
     va_start(ap,fmt);
-    vslog(st,LOG_SETUP_TIMEOUT,fmt,ap);
+
+    slilog_part(st->log,class,"%s: ",st->tunname);
+    vslilog_part(st->log,class,fmt,ap);
+
+    const char *delim;
+    int i;
+    for (i=0, delim=" (tried ";
+        i<st->setup_peers.npeers;
+        i++, delim=", ") {
+       transport_peer *peer=&st->setup_peers.peers[i];
+       const char *s=comm_addr_to_string(&peer->addr);
+       slilog_part(st->log,class,"%s%s",delim,s);
+    }
+
+    slilog_part(st->log,class,")\n");
     va_end(ap);
 }
 
@@ -1156,6 +1174,7 @@ static void site_resolve_callback(void *sst, struct in_addr *address)
 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
                                 const struct comm_addr *prod_hint)
 {
+    /* Reentrancy hazard: can call enter_new_state/enter_state_* */
     if (st->state!=SITE_RUN) return False;
     slog(st,LOG_SETUP_INIT,"initiating key exchange (%s)",reason);
     if (st->address) {
@@ -1268,12 +1287,12 @@ static void enter_state_run(struct site *st)
 
 static bool_t enter_state_resolve(struct site *st)
 {
+    /* Reentrancy hazard!  See ensure_resolving. */
     state_assert(st,st->state==SITE_RUN);
     slog(st,LOG_STATE,"entering state RESOLVE");
     st->state=SITE_RESOLVE;
-    st->resolver->request(st->resolver->st,st->address,
-                         site_resolve_callback,st);
-    return True;
+    return st->resolver->request(st->resolver->st,st->address,
+                                site_resolve_callback,st);
 }
 
 static bool_t enter_new_state(struct site *st, uint32_t next)