summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2009-07-09 16:01:30 +0000
committerMatt Johnston <matt@ucc.asn.au>2009-07-09 16:01:30 +0000
commit4bca3dfa8792367172193e9da165d8c1a8a0e22c (patch)
tree622d110fb930622e62c347ba3965fb3d1eff3165
parent47b781384ed84fd11d885108337753cdbeea9cbb (diff)
downloaddropbear-4bca3dfa8792367172193e9da165d8c1a8a0e22c.tar.gz
- For uclinux, only cleanup on exit for the main process. This avoids
trashing the state when a failing child exits.
-rw-r--r--session.h4
-rw-r--r--svr-session.c21
2 files changed, 21 insertions, 4 deletions
diff --git a/session.h b/session.h
index 5a4569e..e52b074 100644
--- a/session.h
+++ b/session.h
@@ -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 {
diff --git a/svr-session.c b/svr-session.c
index eaccfe5..89b16cb 100644
--- a/svr-session.c
+++ b/svr-session.c
@@ -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);