Mercurial > dropbear
comparison common-session.c @ 1049:01eea88963f3 fastopen
merge from default
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 28 Feb 2015 09:06:40 +0800 |
parents | 0da8ba489c23 3fb883a6aa81 |
children | c2a50c9f509e |
comparison
equal
deleted
inserted
replaced
1048:9cec9ed503bb | 1049:01eea88963f3 |
---|---|
244 } /* for(;;) */ | 244 } /* for(;;) */ |
245 | 245 |
246 /* Not reached */ | 246 /* Not reached */ |
247 } | 247 } |
248 | 248 |
249 static void cleanup_buf(buffer **buf) { | |
250 if (!*buf) { | |
251 return; | |
252 } | |
253 buf_burn(*buf); | |
254 buf_free(*buf); | |
255 *buf = NULL; | |
256 } | |
257 | |
249 /* clean up a session on exit */ | 258 /* clean up a session on exit */ |
250 void session_cleanup() { | 259 void session_cleanup() { |
251 | 260 |
252 TRACE(("enter session_cleanup")) | 261 TRACE(("enter session_cleanup")) |
253 | 262 |
255 if (!sessinitdone) { | 264 if (!sessinitdone) { |
256 TRACE(("leave session_cleanup: !sessinitdone")) | 265 TRACE(("leave session_cleanup: !sessinitdone")) |
257 return; | 266 return; |
258 } | 267 } |
259 | 268 |
269 /* Beware of changing order of functions here. */ | |
270 | |
271 /* Must be before extra_session_cleanup() */ | |
272 chancleanup(); | |
273 | |
260 if (ses.extra_session_cleanup) { | 274 if (ses.extra_session_cleanup) { |
261 ses.extra_session_cleanup(); | 275 ses.extra_session_cleanup(); |
262 } | 276 } |
263 | 277 |
264 chancleanup(); | 278 /* After these are freed most functions will exit */ |
265 | 279 #ifdef DROPBEAR_CLEANUP |
266 /* Cleaning up keys must happen after other cleanup | 280 /* listeners call cleanup functions, this should occur before |
267 functions which might queue packets */ | 281 other session state is freed. */ |
268 if (ses.session_id) { | 282 remove_all_listeners(); |
269 buf_burn(ses.session_id); | 283 |
270 buf_free(ses.session_id); | 284 while (!isempty(&ses.writequeue)) { |
271 ses.session_id = NULL; | 285 buf_free(dequeue(&ses.writequeue)); |
272 } | 286 } |
273 if (ses.hash) { | 287 |
274 buf_burn(ses.hash); | 288 m_free(ses.remoteident); |
275 buf_free(ses.hash); | 289 m_free(ses.authstate.pw_dir); |
276 ses.hash = NULL; | 290 m_free(ses.authstate.pw_name); |
277 } | 291 m_free(ses.authstate.pw_shell); |
292 m_free(ses.authstate.pw_passwd); | |
293 m_free(ses.authstate.username); | |
294 #endif | |
295 | |
296 cleanup_buf(&ses.session_id); | |
297 cleanup_buf(&ses.hash); | |
298 cleanup_buf(&ses.payload); | |
299 cleanup_buf(&ses.readbuf); | |
300 cleanup_buf(&ses.writepayload); | |
301 cleanup_buf(&ses.kexhashbuf); | |
302 cleanup_buf(&ses.transkexinit); | |
303 if (ses.dh_K) { | |
304 mp_clear(ses.dh_K); | |
305 } | |
306 m_free(ses.dh_K); | |
307 | |
278 m_burn(ses.keys, sizeof(struct key_context)); | 308 m_burn(ses.keys, sizeof(struct key_context)); |
279 m_free(ses.keys); | 309 m_free(ses.keys); |
280 | 310 |
281 TRACE(("leave session_cleanup")) | 311 TRACE(("leave session_cleanup")) |
282 } | 312 } |
403 TRACE(("leave ident_readln: return %d", pos+1)) | 433 TRACE(("leave ident_readln: return %d", pos+1)) |
404 return pos+1; | 434 return pos+1; |
405 } | 435 } |
406 | 436 |
407 void ignore_recv_response() { | 437 void ignore_recv_response() { |
408 // Do nothing | 438 /* Do nothing */ |
409 TRACE(("Ignored msg_request_response")) | 439 TRACE(("Ignored msg_request_response")) |
410 } | 440 } |
411 | 441 |
412 static void send_msg_keepalive() { | 442 static void send_msg_keepalive() { |
443 time_t old_time_idle = ses.last_packet_time_idle; | |
444 struct Channel *chan = get_any_ready_channel(); | |
445 | |
413 CHECKCLEARTOWRITE(); | 446 CHECKCLEARTOWRITE(); |
414 time_t old_time_idle = ses.last_packet_time_idle; | |
415 | |
416 struct Channel *chan = get_any_ready_channel(); | |
417 | 447 |
418 if (chan) { | 448 if (chan) { |
419 /* Channel requests are preferable, more implementations | 449 /* Channel requests are preferable, more implementations |
420 handle them than SSH_MSG_GLOBAL_REQUEST */ | 450 handle them than SSH_MSG_GLOBAL_REQUEST */ |
421 TRACE(("keepalive channel request %d", chan->index)) | 451 TRACE(("keepalive channel request %d", chan->index)) |