From 2d9e5c9eb6692b796ec62b713efe0c522e1afb05 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 12 Dec 2023 20:11:22 +0100 Subject: [PATCH] libsmartcols: make cell data printing more robust * use zero terminated data in continuous sample * don't call strlen() for empty strings * make sure library check for data size during printing Unfortunately, previous library versions support cell data buffer update without inform library about a change. Signed-off-by: Karel Zak --- libsmartcols/samples/continuous.c | 2 +- libsmartcols/src/cell.c | 4 ++-- libsmartcols/src/print.c | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libsmartcols/samples/continuous.c b/libsmartcols/samples/continuous.c index 90afb82999..432b027bf9 100644 --- a/libsmartcols/samples/continuous.c +++ b/libsmartcols/samples/continuous.c @@ -85,7 +85,7 @@ int main(void) struct libscols_line *line; struct timeval now; int done = 0; - char *timecell = xmalloc( timecellsz ); + char *timecell = xcalloc(1, timecellsz ); line = add_line(tb, i); diff --git a/libsmartcols/src/cell.c b/libsmartcols/src/cell.c index 0ffbfd12e4..df45667ec5 100644 --- a/libsmartcols/src/cell.c +++ b/libsmartcols/src/cell.c @@ -69,7 +69,7 @@ int scols_cell_set_data(struct libscols_cell *ce, const char *data) ce->is_filled = 1; rc = strdup_to_struct_member(ce, data, data); - ce->datasiz = ce->data ? strlen(ce->data) + 1: 0; + ce->datasiz = ce->data && *ce->data ? strlen(ce->data) + 1: 0; return rc; } @@ -91,7 +91,7 @@ int scols_cell_refer_data(struct libscols_cell *ce, char *data) return -EINVAL; free(ce->data); ce->data = data; - ce->datasiz = ce->data ? strlen(ce->data) + 1: 0; + ce->datasiz = ce->data && *ce->data ? strlen(ce->data) + 1: 0; ce->is_filled = 1; return 0; } diff --git a/libsmartcols/src/print.c b/libsmartcols/src/print.c index e3c20ef0ba..88ab5a2f0f 100644 --- a/libsmartcols/src/print.c +++ b/libsmartcols/src/print.c @@ -751,11 +751,14 @@ notree: i++; } - /* Wrapping disabled; let's use data as a classig string. */ + /* Wrapping disabled; let's use data as a classic string. */ } else { data = scols_cell_get_data(ce); datasiz = scols_cell_get_datasiz(ce); + if (data && *data && !datasiz) + datasiz = strlen(data); /* cell content may be updated */ + if (data && datasiz) rc = ul_buffer_append_data(buf, data, datasiz); } -- 2.47.3