OSDN Git Service

get_terminal_width_height: do not pass insanely large values
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 27 Oct 2006 09:03:24 +0000 (09:03 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 27 Oct 2006 09:03:24 +0000 (09:03 -0000)
coreutils/watch.c
editors/vi.c
libbb/xfuncs.c
networking/telnet.c
networking/wget.c
procps/ps.c

index b188b41..81856c8 100644 (file)
@@ -58,7 +58,6 @@ int watch_main(int argc, char **argv)
                        time_t t;
 
                        get_terminal_width_height(STDOUT_FILENO, &width, 0);
-                       if (width < 1) width = 1; // paranoia
                        header = xrealloc(header, width--);
                        // '%-*s' pads header with spaces to the full width
                        snprintf(header, width, "Every %ds: %-*s", period, width, cmd);
index 82985ce..f1c7989 100644 (file)
@@ -2039,7 +2039,7 @@ static void winch_sig(int sig ATTRIBUTE_UNUSED)
 {
        signal(SIGWINCH, winch_sig);
        if (ENABLE_FEATURE_VI_WIN_RESIZE)
-          get_terminal_width_height(0, &columns, &rows);
+               get_terminal_width_height(0, &columns, &rows);
        new_screen(rows, columns);      // get memory for virtual screen
        redraw(TRUE);           // re-draw the screen
 }
index 1144a67..c722650 100644 (file)
@@ -281,6 +281,8 @@ off_t fdlength(int fd)
 
        if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512;
 
+       // FIXME: explain why lseek(SEEK_END) is not used here!
+
        // If not, do a binary search for the last location we can read.  (Some
        // block devices don't do BLKGETSIZE right.)
 
@@ -382,7 +384,8 @@ DIR *xopendir(const char *path)
 // Die with an error message if we can't daemonize.
 void xdaemon(int nochdir, int noclose)
 {
-       if (daemon(nochdir, noclose)) bb_perror_msg_and_die("daemon");
+       if (daemon(nochdir, noclose))
+               bb_perror_msg_and_die("daemon");
 }
 #endif
 
@@ -416,23 +419,31 @@ void xstat(char *name, struct stat *stat_buf)
 }
 
 /* It is perfectly ok to pass in a NULL for either width or for
- *  * height, in which case that value will not be set.  */
+ * height, in which case that value will not be set.  */
 int get_terminal_width_height(int fd, int *width, int *height)
 {
        struct winsize win = { 0, 0, 0, 0 };
        int ret = ioctl(fd, TIOCGWINSZ, &win);
-       if (!win.ws_row) {
-               char *s = getenv("LINES");
-               if (s) win.ws_row = atoi(s);
+
+       if (height) {
+               if (!win.ws_row) {
+                       char *s = getenv("LINES");
+                       if (s) win.ws_row = atoi(s);
+               }
+               if (win.ws_row <= 1 || win.ws_row >= 30000)
+                       win.ws_row = 24;
+               *height = (int) win.ws_row;
        }
-       if (win.ws_row <= 1) win.ws_row = 24;
-       if (!win.ws_col) {
-               char *s = getenv("COLUMNS");
-               if (s) win.ws_col = atoi(s);
+
+       if (width) {
+               if (!win.ws_col) {
+                       char *s = getenv("COLUMNS");
+                       if (s) win.ws_col = atoi(s);
+               }
+               if (win.ws_col <= 1 || win.ws_col >= 30000)
+                       win.ws_col = 80;
+               *width = (int) win.ws_col;
        }
-       if (win.ws_col <= 1) win.ws_col = 80;
-       if (height) *height = (int) win.ws_row;
-       if (width) *width = (int) win.ws_col;
 
        return ret;
 }
index 5b8c885..628e2e6 100644 (file)
@@ -607,7 +607,7 @@ int telnet_main(int argc, char** argv)
 #endif
 
 #ifdef CONFIG_FEATURE_TELNET_TTYPE
-    ttype = getenv("TERM");
+       ttype = getenv("TERM");
 #endif
 
        memset(&G, 0, sizeof G);
index 425abc1..c163209 100644 (file)
@@ -676,7 +676,7 @@ getttywidth(void)
 {
        int width=0;
        get_terminal_width_height(0, &width, NULL);
-       return (width);
+       return width;
 }
 
 static void
index 0452a50..4a91728 100644 (file)
@@ -41,7 +41,7 @@ int ps_main(int argc, char **argv)
        /* if w is given once, GNU ps sets the width to 132,
         * if w is given more than once, it is "unlimited"
         */
-       if(w_count) {
+       if (w_count) {
                terminal_width = (w_count==1) ? 132 : INT_MAX;
        } else {
                get_terminal_width_height(1, &terminal_width, NULL);
@@ -87,24 +87,24 @@ int ps_main(int argc, char **argv)
                }
                else
 #endif
-                       if(p->rss == 0)
+                       if (p->rss == 0)
                                len = printf("%5d %-8s        %s ", p->pid, p->user, p->state);
                        else
                                len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
 
                i = terminal_width-len;
 
-               if(namecmd && namecmd[0]) {
-                       if(i < 0)
+               if (namecmd && namecmd[0]) {
+                       if (i < 0)
                                i = 0;
-                       if(strlen(namecmd) > (size_t)i)
+                       if (strlen(namecmd) > (size_t)i)
                                namecmd[i] = 0;
                        printf("%s\n", namecmd);
                } else {
                        namecmd = p->short_cmd;
-                       if(i < 2)
+                       if (i < 2)
                                i = 2;
-                       if(strlen(namecmd) > ((size_t)i-2))
+                       if (strlen(namecmd) > ((size_t)i-2))
                                namecmd[i-2] = 0;
                        printf("[%s]\n", namecmd);
                }