get_terminal_width_height: do not pass insanely large values
This commit is contained in:
parent
d3d004dd35
commit
621204bbf6
@ -58,7 +58,6 @@ int watch_main(int argc, char **argv)
|
|||||||
time_t t;
|
time_t t;
|
||||||
|
|
||||||
get_terminal_width_height(STDOUT_FILENO, &width, 0);
|
get_terminal_width_height(STDOUT_FILENO, &width, 0);
|
||||||
if (width < 1) width = 1; // paranoia
|
|
||||||
header = xrealloc(header, width--);
|
header = xrealloc(header, width--);
|
||||||
// '%-*s' pads header with spaces to the full width
|
// '%-*s' pads header with spaces to the full width
|
||||||
snprintf(header, width, "Every %ds: %-*s", period, width, cmd);
|
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);
|
signal(SIGWINCH, winch_sig);
|
||||||
if (ENABLE_FEATURE_VI_WIN_RESIZE)
|
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
|
new_screen(rows, columns); // get memory for virtual screen
|
||||||
redraw(TRUE); // re-draw the 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;
|
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
|
// If not, do a binary search for the last location we can read. (Some
|
||||||
// block devices don't do BLKGETSIZE right.)
|
// 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.
|
// Die with an error message if we can't daemonize.
|
||||||
void xdaemon(int nochdir, int noclose)
|
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
|
#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
|
/* 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)
|
int get_terminal_width_height(int fd, int *width, int *height)
|
||||||
{
|
{
|
||||||
struct winsize win = { 0, 0, 0, 0 };
|
struct winsize win = { 0, 0, 0, 0 };
|
||||||
int ret = ioctl(fd, TIOCGWINSZ, &win);
|
int ret = ioctl(fd, TIOCGWINSZ, &win);
|
||||||
if (!win.ws_row) {
|
|
||||||
char *s = getenv("LINES");
|
if (height) {
|
||||||
if (s) win.ws_row = atoi(s);
|
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) {
|
if (width) {
|
||||||
char *s = getenv("COLUMNS");
|
if (!win.ws_col) {
|
||||||
if (s) win.ws_col = atoi(s);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -607,7 +607,7 @@ int telnet_main(int argc, char** argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_TELNET_TTYPE
|
#ifdef CONFIG_FEATURE_TELNET_TTYPE
|
||||||
ttype = getenv("TERM");
|
ttype = getenv("TERM");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memset(&G, 0, sizeof G);
|
memset(&G, 0, sizeof G);
|
||||||
|
@ -676,7 +676,7 @@ getttywidth(void)
|
|||||||
{
|
{
|
||||||
int width=0;
|
int width=0;
|
||||||
get_terminal_width_height(0, &width, NULL);
|
get_terminal_width_height(0, &width, NULL);
|
||||||
return (width);
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
14
procps/ps.c
14
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 once, GNU ps sets the width to 132,
|
||||||
* if w is given more than once, it is "unlimited"
|
* if w is given more than once, it is "unlimited"
|
||||||
*/
|
*/
|
||||||
if(w_count) {
|
if (w_count) {
|
||||||
terminal_width = (w_count==1) ? 132 : INT_MAX;
|
terminal_width = (w_count==1) ? 132 : INT_MAX;
|
||||||
} else {
|
} else {
|
||||||
get_terminal_width_height(1, &terminal_width, NULL);
|
get_terminal_width_height(1, &terminal_width, NULL);
|
||||||
@ -87,24 +87,24 @@ int ps_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if(p->rss == 0)
|
if (p->rss == 0)
|
||||||
len = printf("%5d %-8s %s ", p->pid, p->user, p->state);
|
len = printf("%5d %-8s %s ", p->pid, p->user, p->state);
|
||||||
else
|
else
|
||||||
len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
|
len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
|
||||||
|
|
||||||
i = terminal_width-len;
|
i = terminal_width-len;
|
||||||
|
|
||||||
if(namecmd && namecmd[0]) {
|
if (namecmd && namecmd[0]) {
|
||||||
if(i < 0)
|
if (i < 0)
|
||||||
i = 0;
|
i = 0;
|
||||||
if(strlen(namecmd) > (size_t)i)
|
if (strlen(namecmd) > (size_t)i)
|
||||||
namecmd[i] = 0;
|
namecmd[i] = 0;
|
||||||
printf("%s\n", namecmd);
|
printf("%s\n", namecmd);
|
||||||
} else {
|
} else {
|
||||||
namecmd = p->short_cmd;
|
namecmd = p->short_cmd;
|
||||||
if(i < 2)
|
if (i < 2)
|
||||||
i = 2;
|
i = 2;
|
||||||
if(strlen(namecmd) > ((size_t)i-2))
|
if (strlen(namecmd) > ((size_t)i-2))
|
||||||
namecmd[i-2] = 0;
|
namecmd[i-2] = 0;
|
||||||
printf("[%s]\n", namecmd);
|
printf("[%s]\n", namecmd);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user