svn commit: r344641 - stable/12/usr.bin/top
Dimitry Andric
dim at FreeBSD.org
Wed Feb 27 22:12:05 UTC 2019
Author: dim
Date: Wed Feb 27 22:12:04 2019
New Revision: 344641
URL: https://svnweb.freebsd.org/changeset/base/344641
Log:
MFC r344381:
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.
Modified:
stable/12/usr.bin/top/display.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/usr.bin/top/display.c
==============================================================================
--- stable/12/usr.bin/top/display.c Wed Feb 27 22:05:01 2019 (r344640)
+++ stable/12/usr.bin/top/display.c Wed Feb 27 22:12:04 2019 (r344641)
@@ -378,13 +378,13 @@ u_procstates(int total, int *brkdn)
if (ltotal != total)
{
/* move and overwrite */
-if (x_procstate == 0) {
- Move_to(x_procstate, y_procstate);
-}
-else {
- /* cursor is already there...no motion needed */
- assert(lastline == 1);
-}
+ if (x_procstate == 0) {
+ Move_to(x_procstate, y_procstate);
+ }
+ else {
+ /* cursor is already there...no motion needed */
+ assert(lastline == 1);
+ }
printf("%d", total);
/* 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;
putchar(ch);
*old = ch;
- lastcol = 1;
+ lastcol = start + 1;
}
old++;
@@ -1341,33 +1341,27 @@ i_uptime(struct timeval *bt, time_t *tod)
}
}
+#define SETUPBUFFER_MIN_SCREENWIDTH 80
#define SETUPBUFFER_REQUIRED_ADDBUFSIZ 2
static char *
setup_buffer(char *buffer, int addlen)
{
- char *b = NULL;
+ size_t len;
- if (NULL == buffer) {
- setup_buffer_bufsiz = screen_width;
- b = calloc(setup_buffer_bufsiz + addlen +
- SETUPBUFFER_REQUIRED_ADDBUFSIZ,
- 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;
- }
- }
+ setup_buffer_bufsiz = screen_width;
+ if (setup_buffer_bufsiz < SETUPBUFFER_MIN_SCREENWIDTH)
+ {
+ setup_buffer_bufsiz = SETUPBUFFER_MIN_SCREENWIDTH;
+ }
- if (NULL == b) {
- errx(4, "can't allocate sufficient memory");
- }
+ free(buffer);
+ 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;
}
More information about the svn-src-stable-12
mailing list