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))