]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Don't crash when the socket gets closed between updates.
authorMartin Mares <mj@ucw.cz>
Mon, 8 May 2000 14:53:22 +0000 (14:53 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 8 May 2000 14:53:22 +0000 (14:53 +0000)
Also, this time not only update `remains', but update it right :)

TODO
proto/bgp/packets.c

diff --git a/TODO b/TODO
index 7eb9bed73af646666ed13c0d46596a0c63c2dcc4..22e7efe024cde8cf468e3fe3f3aa55d68e6c7fce 100644 (file)
--- a/TODO
+++ b/TODO
@@ -22,6 +22,8 @@ Core
 - client: paging?
 - client: data losses on large dumps?
 
+- table: ocassional core dumps in rt_prune()
+
 - bgp: timing of updates?
 - bgp: dump and get_route_info
 
index 7a866fca4abe7cb6f25cecb97f05dd034cef14bb..0d9b702a97a8d903c71f95dc0403e373c90c7fb2 100644 (file)
@@ -62,7 +62,7 @@ bgp_encode_prefixes(struct bgp_proto *p, byte *w, struct bgp_bucket *buck, unsig
       ipa_hton(a);
       memcpy(w, &a, bytes);
       w += bytes;
-      remains -= bytes;
+      remains -= bytes + 1;
       rem_node(&px->bucket_node);
       fib_delete(&p->prefix_fib, px);
     }
@@ -232,11 +232,17 @@ bgp_fire_tx(struct bgp_conn *conn)
   struct bgp_proto *p = conn->bgp;
   unsigned int s = conn->packets_to_send;
   sock *sk = conn->sk;
-  byte *buf = sk->tbuf;
-  byte *pkt = buf + BGP_HEADER_LENGTH;
-  byte *end;
+  byte *buf, *pkt, *end;
   int type;
 
+  if (!sk)
+    {
+      conn->packets_to_send = 0;
+      return 0;
+    }
+  buf = sk->tbuf;
+  pkt = buf + BGP_HEADER_LENGTH;
+
   if (s & (1 << PKT_SCHEDULE_CLOSE))
     {
       bgp_close_conn(conn);
@@ -284,7 +290,7 @@ bgp_schedule_packet(struct bgp_conn *conn, int type)
 {
   DBG("BGP: Scheduling packet type %d\n", type);
   conn->packets_to_send |= 1 << type;
-  if (conn->sk->tpos == conn->sk->tbuf)
+  if (conn->sk && conn->sk->tpos == conn->sk->tbuf)
     while (bgp_fire_tx(conn))
       ;
 }