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:
Dimitry Andric 2019-02-20 20:17:54 +00:00
parent 093295ae49
commit 281bdc30df
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=344381

View File

@ -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;
} }