X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/4c5b873c160b2d3ed9fbc3afa2214fca6dac4c2f..6db084b8b35c8dc4b510caef60f52aa02ceebcbf:/unix/uxpty.c diff --git a/unix/uxpty.c b/unix/uxpty.c index a1f96946..5ebd0504 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -270,7 +270,6 @@ static void fatal_sig_handler(int signum) { putty_signal(signum, SIG_DFL); cleanup_utmp(); - setuid(getuid()); raise(signum); } #endif @@ -412,6 +411,7 @@ void pty_pre_init(void) #endif pty = single_pty = snew(struct pty_tag); + pty->conf = NULL; bufchain_init(&pty->output_data); /* set the child signal handler straight away; it needs to be set @@ -531,11 +531,23 @@ void pty_pre_init(void) int gid = getgid(), uid = getuid(); int setresgid(gid_t, gid_t, gid_t); int setresuid(uid_t, uid_t, uid_t); - setresgid(gid, gid, gid); - setresuid(uid, uid, uid); + if (setresgid(gid, gid, gid) < 0) { + perror("setresgid"); + exit(1); + } + if (setresuid(uid, uid, uid) < 0) { + perror("setresuid"); + exit(1); + } #else - setgid(getgid()); - setuid(getuid()); + if (setgid(getgid()) < 0) { + perror("setgid"); + exit(1); + } + if (setuid(getuid()) < 0) { + perror("setuid"); + exit(1); + } #endif } } @@ -622,6 +634,7 @@ int pty_real_select_result(Pty pty, int event, int status) if (close_on_exit == FORCE_OFF || (close_on_exit == AUTO && pty->exit_code != 0)) { char message[512]; + message[0] = '\0'; if (WIFEXITED(pty->exit_code)) sprintf(message, "\r\n[pterm: process terminated with exit" " code %d]\r\n", WEXITSTATUS(pty->exit_code)); @@ -713,6 +726,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf, if (single_pty) { pty = single_pty; + assert(pty->conf == NULL); } else { pty = snew(struct pty_tag); pty->master_fd = pty->slave_fd = -1; @@ -955,7 +969,17 @@ static void pty_free(void *handle) del234(ptys_by_pid, pty); del234(ptys_by_fd, pty); - sfree(pty); + conf_free(pty->conf); + pty->conf = NULL; + + if (pty == single_pty) { + /* + * Leave this structure around in case we need to Restart + * Session. + */ + } else { + sfree(pty); + } } static void pty_try_write(Pty pty)