chiark / gitweb /
server/{keyexch,peer}.c: Maybe key-exchange messages come out of the blue.
[tripe] / server / keyexch.c
index 7d1fa7dfc0b7d147f4d900b1ca352b6a13ffc6c1..4a990ee708b9328501411b2e029a7d204ce11c67 100644 (file)
@@ -1320,24 +1320,27 @@ void kx_start(keyexch *kx, int forcep)
 /* --- @kx_message@ --- *
  *
  * Arguments:  @keyexch *kx@ = pointer to key exchange context
+ *             @const addr *a@ = sender's IP address and port
  *             @unsigned msg@ = the message code
  *             @buf *b@ = pointer to buffer containing the packet
  *
- * Returns:    ---
+ * Returns:    Nonzero if the sender's address was unknown.
  *
  * Use:                Reads a packet containing key exchange messages and handles
  *             it.
  */
 
-void kx_message(keyexch *kx, unsigned msg, buf *b)
+int kx_message(keyexch *kx, const addr *a, unsigned msg, buf *b)
 {
   size_t sz = BSZ(b);
   int rc;
 
-  if (notice_message(kx)) return;
+  T( trace(T_KEYEXCH, "keyexch: processing %s packet from %c%s%c",
+          msg < KX_NMSG ? pkname[msg] : "unknown",
+          kx ? '`' : '<', kx ? p_name(kx->p) : "nil", kx ? '\'' : '>'); )
 
-  T( trace(T_KEYEXCH, "keyexch: processing %s packet from `%s'",
-          msg < KX_NMSG ? pkname[msg] : "unknown", p_name(kx->p)); )
+  if (!kx) return (-1);
+  if (notice_message(kx)) return (0);
 
   switch (msg) {
     case KX_PRECHAL: rc = doprechallenge(kx, b); break;
@@ -1352,6 +1355,7 @@ void kx_message(keyexch *kx, unsigned msg, buf *b)
   }
 
   update_stats_rx(kx, !rc, sz);
+  return (0);
 }
 
 /* --- @kx_free@ --- *