mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-05 21:42:47 -05:00
mainchan.c: rewrite handling of open-failure aborts.
This is another case where a stale pointer bug could have arisen from a toplevel callback going off after an object was freed. But here, just adding delete_callbacks_for_context wouldn't help. The actual context parameter for the callback wasn't mainchan itself; it was a tiny separate object, allocated to hold just the parameters of the function the callback wanted to call. So if _those_ parameters became stale before the callback was triggered, then even delete_callbacks_for_context wouldn't have been able to help. Also, mainchan itself would have been freed moments after this callback was queued, so moving it to be a callback on mainchan itself wouldn't help. Solution: move the callback right out to Ssh, by introducing a new ssh_sw_abort_deferred() which is just like ssh_sw_abort but does its main work in a toplevel callback. Then ssh.c's existing call to delete_callbacks_for_context will clean it up if necessary.
This commit is contained in:
1
ssh.h
1
ssh.h
@ -407,6 +407,7 @@ void ssh_remote_error(Ssh *ssh, const char *fmt, ...);
|
||||
void ssh_remote_eof(Ssh *ssh, const char *fmt, ...);
|
||||
void ssh_proto_error(Ssh *ssh, const char *fmt, ...);
|
||||
void ssh_sw_abort(Ssh *ssh, const char *fmt, ...);
|
||||
void ssh_sw_abort_deferred(Ssh *ssh, const char *fmt, ...);
|
||||
void ssh_user_close(Ssh *ssh, const char *fmt, ...);
|
||||
|
||||
/* Bit positions in the SSH-1 cipher protocol word */
|
||||
|
Reference in New Issue
Block a user