From 621204bbf6750f1ba3977b43bb35375ddda6b5ae Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Fri, 27 Oct 2006 09:03:24 +0000 Subject: [PATCH] get_terminal_width_height: do not pass insanely large values --- coreutils/watch.c | 1 - editors/vi.c | 2 +- libbb/xfuncs.c | 35 +++++++++++++++++++++++------------ networking/telnet.c | 2 +- networking/wget.c | 2 +- procps/ps.c | 14 +++++++------- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/coreutils/watch.c b/coreutils/watch.c index b188b4176..81856c867 100644 --- a/coreutils/watch.c +++ b/coreutils/watch.c @@ -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); diff --git a/editors/vi.c b/editors/vi.c index 82985ced0..f1c79895e 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -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 } diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 1144a67c6..c72265003 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -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; } diff --git a/networking/telnet.c b/networking/telnet.c index 5b8c885e2..628e2e6e3 100644 --- a/networking/telnet.c +++ b/networking/telnet.c @@ -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); diff --git a/networking/wget.c b/networking/wget.c index 425abc13f..c163209f2 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -676,7 +676,7 @@ getttywidth(void) { int width=0; get_terminal_width_height(0, &width, NULL); - return (width); + return width; } static void diff --git a/procps/ps.c b/procps/ps.c index 0452a5046..4a917282b 100644 --- a/procps/ps.c +++ b/procps/ps.c @@ -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); } -- 2.25.1