- For uclinux, only cleanup on exit for the main process. This avoids

trashing the state when a failing child exits.

--HG--
extra : convert_revision : 5d029ce4602908c3becf0035cf2b7e62816959bc
This commit is contained in:
Matt Johnston 2009-07-09 16:01:30 +00:00
parent cb82c6e3e0
commit a996e61a2e
2 changed files with 21 additions and 4 deletions

View File

@ -213,6 +213,10 @@ struct serversession {
/* The numeric address they connected from, used for logging */
char * addrstring;
#ifdef __uClinux__
pid_t server_pid;
#endif
};
typedef enum {

View File

@ -85,6 +85,10 @@ void svr_session(int sock, int childpipe,
/* Initialise server specific parts of the session */
svr_ses.childpipe = childpipe;
svr_ses.addrstring = addrstring;
#ifdef __uClinux__
svr_ses.server_pid = getpid();
#endif
svr_ses.addrstring = addrstring;
svr_authinitialise();
chaninitialise(svr_chantypes);
svr_chansessinitialise();
@ -144,11 +148,20 @@ void svr_dropbear_exit(int exitcode, const char* format, va_list param) {
_dropbear_log(LOG_INFO, fmtbuf, param);
/* free potential public key options */
svr_pubkey_options_cleanup();
#ifdef __uClinux__
/* only the main server process should cleanup - we don't want
* forked children doing that */
if (svr_ses.server_pid == getpid())
#else
if (1)
#endif
{
/* free potential public key options */
svr_pubkey_options_cleanup();
/* must be after we've done with username etc */
common_session_cleanup();
/* must be after we've done with username etc */
common_session_cleanup();
}
exit(exitcode);