Browse Source

peer: don't free unclosed connection.

We need to close it first, otherwise use after free in
peer_disconnect.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 9 years ago
parent
commit
4c136dde98
  1. 9
      daemon/peer.c

9
daemon/peer.c

@ -163,7 +163,7 @@ static void state_single(struct peer *peer,
}
/* Break out and free this peer if it's completely done. */
if (peer->state == STATE_CLOSED)
if (peer->state == STATE_CLOSED && !peer->conn)
io_break(peer);
}
@ -333,7 +333,14 @@ static void peer_disconnect(struct io_conn *conn, struct peer *peer)
return;
}
/* Completely dead? Free it now. */
if (peer->state == STATE_CLOSED) {
io_break(peer);
return;
}
/* FIXME: Try to reconnect. */
/* This is an expected close. */
if (peer->cond == PEER_CLOSED)
return;

Loading…
Cancel
Save