Fix more AddressSanitizer violations in usr.bin/top
In line_update(), set lastcol correctly after moving to any non-zero column, so the "overwrite old stuff" part does not attempt to address negative offsets in the current line. Rewrite setup_buffer() to always allocate at least 80 characters, otherwise various calls to summary_format() will overwrite the end of the buffers, if the screen width gets small enough. MFC after: 1 week
This commit is contained in:
parent
093295ae49
commit
281bdc30df
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=344381
@ -378,13 +378,13 @@ u_procstates(int total, int *brkdn)
|
|||||||
if (ltotal != total)
|
if (ltotal != total)
|
||||||
{
|
{
|
||||||
/* move and overwrite */
|
/* move and overwrite */
|
||||||
if (x_procstate == 0) {
|
if (x_procstate == 0) {
|
||||||
Move_to(x_procstate, y_procstate);
|
Move_to(x_procstate, y_procstate);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* cursor is already there...no motion needed */
|
/* cursor is already there...no motion needed */
|
||||||
assert(lastline == 1);
|
assert(lastline == 1);
|
||||||
}
|
}
|
||||||
printf("%d", total);
|
printf("%d", total);
|
||||||
|
|
||||||
/* if number of digits differs, rewrite the label */
|
/* if number of digits differs, rewrite the label */
|
||||||
@ -1205,7 +1205,7 @@ line_update(char *old, char *new, int start, int line)
|
|||||||
cursor_on_line = true;
|
cursor_on_line = true;
|
||||||
putchar(ch);
|
putchar(ch);
|
||||||
*old = ch;
|
*old = ch;
|
||||||
lastcol = 1;
|
lastcol = start + 1;
|
||||||
}
|
}
|
||||||
old++;
|
old++;
|
||||||
|
|
||||||
@ -1341,33 +1341,27 @@ i_uptime(struct timeval *bt, time_t *tod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SETUPBUFFER_MIN_SCREENWIDTH 80
|
||||||
#define SETUPBUFFER_REQUIRED_ADDBUFSIZ 2
|
#define SETUPBUFFER_REQUIRED_ADDBUFSIZ 2
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
setup_buffer(char *buffer, int addlen)
|
setup_buffer(char *buffer, int addlen)
|
||||||
{
|
{
|
||||||
char *b = NULL;
|
size_t len;
|
||||||
|
|
||||||
if (NULL == buffer) {
|
setup_buffer_bufsiz = screen_width;
|
||||||
setup_buffer_bufsiz = screen_width;
|
if (setup_buffer_bufsiz < SETUPBUFFER_MIN_SCREENWIDTH)
|
||||||
b = calloc(setup_buffer_bufsiz + addlen +
|
{
|
||||||
SETUPBUFFER_REQUIRED_ADDBUFSIZ,
|
setup_buffer_bufsiz = SETUPBUFFER_MIN_SCREENWIDTH;
|
||||||
sizeof(char));
|
}
|
||||||
} else {
|
|
||||||
if (screen_width > setup_buffer_bufsiz) {
|
|
||||||
setup_buffer_bufsiz = screen_width;
|
|
||||||
free(buffer);
|
|
||||||
b = calloc(setup_buffer_bufsiz + addlen +
|
|
||||||
SETUPBUFFER_REQUIRED_ADDBUFSIZ,
|
|
||||||
sizeof(char));
|
|
||||||
} else {
|
|
||||||
b = buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL == b) {
|
free(buffer);
|
||||||
errx(4, "can't allocate sufficient memory");
|
len = setup_buffer_bufsiz + addlen + SETUPBUFFER_REQUIRED_ADDBUFSIZ;
|
||||||
}
|
buffer = calloc(len, sizeof(char));
|
||||||
|
if (buffer == NULL)
|
||||||
|
{
|
||||||
|
errx(4, "can't allocate sufficient memory");
|
||||||
|
}
|
||||||
|
|
||||||
return b;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user