aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-10-27 09:03:24 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-10-27 09:03:24 +0000
commit621204bbf6750f1ba3977b43bb35375ddda6b5ae (patch)
treecd34a619db35dccb76043c1bf118d297e17ac436
parentd3d004dd3507f841745956a035fff68936378f9c (diff)
downloadbusybox-621204bbf6750f1ba3977b43bb35375ddda6b5ae.tar.gz
get_terminal_width_height: do not pass insanely large values
-rw-r--r--coreutils/watch.c1
-rw-r--r--editors/vi.c2
-rw-r--r--libbb/xfuncs.c35
-rw-r--r--networking/telnet.c2
-rw-r--r--networking/wget.c2
-rw-r--r--procps/ps.c14
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);
}