]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: make cell data printing more robust
authorKarel Zak <kzak@redhat.com>
Tue, 12 Dec 2023 19:11:22 +0000 (20:11 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 12 Dec 2023 19:11:22 +0000 (20:11 +0100)
* 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 <kzak@redhat.com>
libsmartcols/samples/continuous.c
libsmartcols/src/cell.c
libsmartcols/src/print.c

index 90afb8299919ed1d3987c84fa1d73548e27f0812..432b027bf9cedd465bce27d959a218bfb4e36c5c 100644 (file)
@@ -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);
 
index 0ffbfd12e4839aa841c683ade0c106a68857da7f..df45667ec587d4c51c9d62b1961e6195cd67a6cd 100644 (file)
@@ -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;
 }
index e3c20ef0ba7c78849ad2911af607627be6c18f8a..88ab5a2f0f91414261b538c3e239fcfece806496 100644 (file)
@@ -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);
                }