summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-05-08 14:53:22 +0000
committerMartin Mares <mj@ucw.cz>2000-05-08 14:53:22 +0000
commit0c3588bf5e43936ea0f1e630dea500912b598c60 (patch)
tree65d4bbde63b35f678369780bc978266dc2fcfc8e /proto
parent6b5ab87581ba496ad0a9c12ef66f1372e1459685 (diff)
Don't crash when the socket gets closed between updates.
Also, this time not only update `remains', but update it right :)
Diffstat (limited to 'proto')
-rw-r--r--proto/bgp/packets.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index 7a866fca..0d9b702a 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -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))
;
}