]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Fix an uninitialised bufchain in NO_PTY_PRE_INIT mode.
authorSimon Tatham <anakin@pobox.com>
Mon, 31 Aug 2015 15:11:37 +0000 (16:11 +0100)
committerSimon Tatham <anakin@pobox.com>
Mon, 31 Aug 2015 15:13:09 +0000 (16:13 +0100)
The Pty that we created in pty_pre_init had its bufchain properly
initialised, but if that one didn't get created, then the one we
create in pty_init did not. Now both should go through the same init
routine.

unix/uxpty.c

index b67a6dad37f5fc633031d02017ce612463ae626b..33cc2c1e702d4e87574f917a75500bfe19d117ae 100644 (file)
@@ -395,6 +395,14 @@ static void pty_open_master(Pty pty)
     add234(ptys_by_fd, pty);
 }
 
+static Pty new_pty_struct(void)
+{
+    Pty pty = snew(struct pty_tag);
+    pty->conf = NULL;
+    bufchain_init(&pty->output_data);
+    return pty;
+}
+
 /*
  * Pre-initialisation. This is here to get around the fact that GTK
  * doesn't like being run in setuid/setgid programs (probably
@@ -419,9 +427,7 @@ void pty_pre_init(void)
     int pipefd[2];
 #endif
 
-    pty = single_pty = snew(struct pty_tag);
-    pty->conf = NULL;
-    bufchain_init(&pty->output_data);
+    pty = single_pty = new_pty_struct();
 
     /* set the child signal handler straight away; it needs to be set
      * before we ever fork. */
@@ -740,7 +746,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
        pty = single_pty;
         assert(pty->conf == NULL);
     } else {
-       pty = snew(struct pty_tag);
+       pty = new_pty_struct();
        pty->master_fd = pty->slave_fd = -1;
 #ifndef OMIT_UTMP
        pty_stamped_utmp = FALSE;
@@ -998,6 +1004,8 @@ static void pty_free(void *handle)
     del234(ptys_by_pid, pty);
     del234(ptys_by_fd, pty);
 
+    bufchain_clear(&pty->output_data);
+
     conf_free(pty->conf);
     pty->conf = NULL;