diff --git a/sesman/scp_v0.c b/sesman/scp_v0.c index a1c919e2..de00068b 100644 --- a/sesman/scp_v0.c +++ b/sesman/scp_v0.c @@ -40,6 +40,7 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) tbus data; struct session_item *s_item; int errorcode = 0; + bool_t do_auth_end = 1; data = auth_userpass(s->username, s->password, &errorcode); @@ -135,6 +136,9 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) log_message(LOG_LEVEL_INFO, "starting Xorg session..."); display = session_start(data, SESMAN_SESSION_TYPE_XORG, c, s); } + /* if the session started up ok, auth_end will be called on + sig child */ + do_auth_end = display == 0; } else { @@ -155,5 +159,8 @@ scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) { scp_v0s_deny_connection(c); } - auth_end(data); + if (do_auth_end) + { + auth_end(data); + } } diff --git a/sesman/scp_v1.c b/sesman/scp_v1.c index f865271b..60f82112 100644 --- a/sesman/scp_v1.c +++ b/sesman/scp_v1.c @@ -42,7 +42,7 @@ void scp_v1_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) { long data; - int display; + int display = 0; int retries; int current_try; enum SCP_SERVER_STATES_E e; @@ -50,6 +50,7 @@ scp_v1_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) struct session_item *sitem; int scount; SCP_SID sid; + bool_t do_auth_end = 1; retries = g_cfg->sec.login_retry; current_try = retries; @@ -128,14 +129,20 @@ scp_v1_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) log_message(LOG_LEVEL_INFO, "starting Xvnc session..."); display = session_start(data, SESMAN_SESSION_TYPE_XVNC, c, s); } - else + else if (SCP_SESSION_TYPE_XRDP == s->type) { log_message(LOG_LEVEL_INFO, "starting X11rdp session..."); display = session_start(data, SESMAN_SESSION_TYPE_XRDP, c, s); } - + else if (SCP_SESSION_TYPE_XORG == s->type) + { + log_message(LOG_LEVEL_INFO, "starting Xorg session..."); + display = session_start(data, SESMAN_SESSION_TYPE_XORG, c, s); + } + /* if the session started up ok, auth_end will be called on + sig child */ + do_auth_end = display == 0; e = scp_v1s_connect_new_session(c, display); - switch (e) { case SCP_SERVER_STATE_OK: @@ -201,7 +208,10 @@ scp_v1_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s) } /* cleanup */ - auth_end(data); + if (do_auth_end) + { + auth_end(data); + } g_free(slist); } diff --git a/sesman/session.c b/sesman/session.c index 8663fc83..aefcd258 100644 --- a/sesman/session.c +++ b/sesman/session.c @@ -456,6 +456,7 @@ session_start_fork(tbus data, tui8 type, struct SCP_CONNECTION *c, return 0; } + auth_start_session(data, display); pid = g_fork(); /* parent is fork from tcp accept, child forks X and wm, then becomes scp */ @@ -498,7 +499,6 @@ session_start_fork(tbus data, tui8 type, struct SCP_CONNECTION *c, g_getpid()); } #endif - auth_start_session(data, display); window_manager_pid = g_fork(); /* parent becomes X, child forks wm, and waits, todo */ if (window_manager_pid == -1) @@ -787,8 +787,6 @@ session_start_fork(tbus data, tui8 type, struct SCP_CONNECTION *c, g_waitpid(window_manager_pid); log_message(LOG_LEVEL_ALWAYS, "window manager (pid %d) did " "exit, cleaning up session", window_manager_pid); - auth_stop_session(data); - auth_end(data); g_sigterm(display_pid); g_sigterm(chansrv_pid); g_deinit(); @@ -918,6 +916,8 @@ session_kill(int pid) if (tmp->item->pid == pid) { + auth_stop_session(tmp->item->data); + auth_end(tmp->item->data); /* deleting the session */ log_message(LOG_LEVEL_INFO, "++ terminated session: username %s, display :%d.0, session_pid %d, ip %s", tmp->item->name, tmp->item->display, tmp->item->pid, tmp->item->client_ip); g_free(tmp->item);