diff options
| author | Neels Hofmeyr <neels@hofmeyr.de> | 2019-08-30 00:15:26 +0200 | 
|---|---|---|
| committer | Neels Hofmeyr <neels@hofmeyr.de> | 2019-08-30 00:38:01 +0200 | 
| commit | f8fe48e7fb2f0fef722bcd0d4cf37f6697ae86b4 (patch) | |
| tree | de5a87972b384ed64084d42c49233f3292dc653c /src/vty | |
| parent | 2d90611cb06b780b165296aa3abd1f7229d503f9 (diff) | |
fix: vty crash by logging during VTY_CLOSED event handling
When a VTY closes, dispatch the VTY_CLOSED signal before tearing down the VTY
buffer and fd.
In particular this fixes:
- a crash during telnet_close_client(), invoked by the VTY_CLOSED event, which
  logs to DLGLOBAL and uses vty->obuf that, so far, vty_close() had already
  unallocated earlier (OS#4164).
- the logging about closing a telnet session so far logged:
    DLGLOBAL INFO Closing telnet connection r=NULL<->l=NULL
  By dispatching the VTY_CLOSED event while the fd is still valid, we instead
  get the actual connection IP address and port being closed:
    DLGLOBAL INFO Closing telnet connection r=127.0.0.1:36708<->l=127.0.0.1:4258
Related: OS#4164
Change-Id: I1d235cbfbfb9aaf411316642c7bcfac12106df44
Diffstat (limited to 'src/vty')
| -rw-r--r-- | src/vty/vty.c | 6 | 
1 files changed, 3 insertions, 3 deletions
| diff --git a/src/vty/vty.c b/src/vty/vty.c index a96d86ce..aa23fa00 100644 --- a/src/vty/vty.c +++ b/src/vty/vty.c @@ -205,6 +205,9 @@ void vty_close(struct vty *vty)  {  	int i; +	/* VTY_CLOSED is handled by the telnet_interface */ +	vty_event(VTY_CLOSED, vty->fd, vty); +  	if (vty->obuf)  {  		/* Flush buffer. */  		buffer_flush_all(vty->obuf, vty->fd); @@ -236,9 +239,6 @@ void vty_close(struct vty *vty)  	/* Check configure. */  	vty_config_unlock(vty); -	/* VTY_CLOSED is handled by the telnet_interface */ -	vty_event(VTY_CLOSED, vty->fd, vty); -  	/* OK free vty. */  	talloc_free(vty);  } | 
