diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index 1db3ff6..ba67206 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -41,6 +41,7 @@ extern "C" { #define PV_SIZEOF_LASTWRITTEN_BUFFER 256 #define PV_SIZEOF_PREVLINE_BUFFER 1024 #define PV_FORMAT_ARRAY_MAX 100 +#define PV_SIZEOF_FORMAT_SEGMENTS_BUF 4096 #define PV_SIZEOF_CRS_LOCK_FILE 1024 #define PV_SIZEOF_FILE_FDINFO 4096 diff --git a/src/pv/display.c b/src/pv/display.c index e0ec9cf..4bea8d9 100644 --- a/src/pv/display.c +++ b/src/pv/display.c @@ -849,7 +849,7 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl bool final) { struct pvdisplay_component_s *format_component_array; - char display_segments[1024]; /* flawfinder: ignore - always bounded */ + char display_segments[PV_SIZEOF_FORMAT_SEGMENTS_BUF]; /* flawfinder: ignore - always bounded */ size_t segment_idx, dynamic_segment_count; const char *display_format; size_t static_portion_width, dynamic_segment_width; @@ -896,7 +896,7 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl /* * Reallocate the output buffer if the display width changes. */ - if (display->display_buffer != NULL && display->display_buffer_size < (size_t) ((state->control.width * 2))) { + if (display->display_buffer != NULL && display->display_buffer_size < (size_t) ((state->control.width * 4))) { free(display->display_buffer); display->display_buffer = NULL; display->display_buffer_size = 0; @@ -909,7 +909,7 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl char *new_buffer; size_t new_size; - new_size = (size_t) ((2 * state->control.width) + 80); + new_size = (size_t) ((4 * state->control.width) + 80); if (NULL != state->control.name) new_size += strlen(state->control.name); /* flawfinder: ignore */ /* flawfinder: name is always set by pv_strdup(), which bounds with a \0. */ @@ -996,6 +996,9 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl if (dynamic_segment_count > 1) dynamic_segment_width /= dynamic_segment_count; + debug("control.width=%d static_portion_width=%d dynamic_segment_width=%d dynamic_segment_count=%d", + state->control.width, static_portion_width, dynamic_segment_width, dynamic_segment_count); + for (segment_idx = 0; segment_idx < display->format_segment_count; segment_idx++) { pvdisplay_segment_t segment; struct pvdisplay_component_s *component;