]> granicus.if.org Git - sudo/commitdiff
Initialize the pty rows/cols based on the values we stored in user_details.
authorTodd C. Miller <Todd.Miller@sudo.ws>
Fri, 5 Oct 2018 20:04:29 +0000 (14:04 -0600)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Fri, 5 Oct 2018 20:04:29 +0000 (14:04 -0600)
This fixes a minor issue where we would send an extra window size
change event the first time the command was suspended.

src/exec_pty.c
src/sudo.c
src/sudo.h

index d906feb55557a6d0f23e70bc5a994f773646500a..b89afd87cc20cf1be368821d11a9484e45853de8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009-2017 Todd C. Miller <Todd.Miller@sudo.ws>
+ * Copyright (c) 2009-2018 Todd C. Miller <Todd.Miller@sudo.ws>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -58,6 +58,8 @@ struct exec_closure_pty {
     pid_t monitor_pid;
     pid_t cmnd_pid;
     pid_t ppgrp;
+    short rows;
+    short cols;
     struct command_status *cstat;
     struct command_details *details;
     struct sudo_event_base *evbase;
@@ -1101,6 +1103,8 @@ fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat,
     ec->ppgrp = ppgrp;
     ec->cstat = cstat;
     ec->details = details;
+    ec->rows = user_details.ts_rows;
+    ec->cols = user_details.ts_cols;
     TAILQ_INIT(&ec->monitor_messages);
 
     /* Setup event base and events. */
@@ -1685,12 +1689,11 @@ del_io_events(bool nonblocking)
 static void
 sync_ttysize(struct exec_closure_pty *ec)
 {
-    static struct winsize owsize;
     struct winsize wsize;
     debug_decl(sync_ttysize, SUDO_DEBUG_EXEC);
 
     if (ioctl(io_fds[SFD_USERTTY], TIOCGWINSZ, &wsize) == 0) {
-       if (wsize.ws_row != owsize.ws_row || wsize.ws_col != owsize.ws_col) {
+       if (wsize.ws_row != ec->rows || wsize.ws_col != ec->cols) {
            const unsigned int wsize_packed = (wsize.ws_row & 0xffff) |
                ((wsize.ws_col & 0xffff) << 16);
 
@@ -1700,8 +1703,9 @@ sync_ttysize(struct exec_closure_pty *ec)
            /* Send window change event to monitor process. */
            send_command_status(ec, CMD_TTYWINCH, wsize_packed);
 
-           /* Update old value. */
-           owsize = wsize;
+           /* Update rows/cols. */
+           ec->rows = wsize.ws_row;
+           ec->cols = wsize.ws_col;
        }
     }
 
index 5c2841c6e6e08122e115bcf2f670b1bfd40f4040..604cd18caf6a195f40714933f842e05ef59b3216 100644 (file)
@@ -595,8 +595,8 @@ get_user_info(struct user_details *ud)
        goto oom;
     ud->host = user_info[i] + sizeof("host=") - 1;
 
-    sudo_get_ttysize(&ud->ts_lines, &ud->ts_cols);
-    if (asprintf(&user_info[++i], "lines=%d", ud->ts_lines) == -1)
+    sudo_get_ttysize(&ud->ts_rows, &ud->ts_cols);
+    if (asprintf(&user_info[++i], "lines=%d", ud->ts_rows) == -1)
        goto oom;
     if (asprintf(&user_info[++i], "cols=%d", ud->ts_cols) == -1)
        goto oom;
index a2a4b5a5baa8e82a6140dc7be05c2cd42128da59..1d8e672dc33427d6c9d07d0ed6c06d7ac9ea897b 100644 (file)
@@ -107,8 +107,8 @@ struct user_details {
     const char *shell;
     GETGROUPS_T *groups;
     int ngroups;
+    int ts_rows;
     int ts_cols;
-    int ts_lines;
 };
 
 #define CD_SET_UID             0x00001