get_terminal_width_height: do not pass insanely large values
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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 | |
| } | |
| @@ -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; | |
| } | |
| @@ -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); | |
| @@ -676,7 +676,7 @@ getttywidth(void) | |
| { | |
| int width=0; | |
| get_terminal_width_height(0, &width, NULL); | |
| - | return (width); |
| + | return width; |
| } | |
| static void | |
| @@ -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); | |
| } | |