From a22af84523eb716b947123186bd4f89a3d92945e Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sat, 28 Aug 2021 09:10:34 +0200 Subject: [PATCH] Fix import of ods files with repeated column data. Fixes bug #61078 Reported-by: Elias Tsolis --- src/data/ods-reader.c | 22 +++++++++------- tests/automake.mk | 1 + tests/data/repeating-2.ods | Bin 0 -> 10797 bytes tests/data/spreadsheet-test.at | 46 +++++++++++++++++++++++++++++++-- 4 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 tests/data/repeating-2.ods diff --git a/src/data/ods-reader.c b/src/data/ods-reader.c index 123ad3ba57..b014a748d7 100644 --- a/src/data/ods-reader.c +++ b/src/data/ods-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2011, 2012, 2013, 2016, 2020 Free Software Foundation, Inc. + Copyright (C) 2011, 2012, 2013, 2016, 2020, 2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -909,25 +909,27 @@ ods_make_reader (struct spreadsheet *spreadsheet, { if (idx >= n_var_specs) { - var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + 1)); + var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + r->rsd.col_span)); memset (var_spec + n_var_specs, - 0, - (idx - n_var_specs + 1) * sizeof (*var_spec)); + 0, + (idx + r->rsd.col_span - n_var_specs) * sizeof (*var_spec)); var_spec [idx].name = NULL; n_var_specs = idx + 1; } - var_spec [idx].firstval.type = type; - var_spec [idx].firstval.text = xmlTextReaderValue (r->rsd.xtr); - var_spec [idx].firstval.value = val_string; + for (int x = 0; x < r->rsd.col_span; ++x) + { + var_spec [idx - x].firstval.type = xmlStrdup (type); + var_spec [idx - x].firstval.text = xmlTextReaderValue (r->rsd.xtr); + var_spec [idx - x].firstval.value = xmlStrdup (val_string); + } - val_string = NULL; - type = NULL; + free (val_string); + free (type); } } - /* Create the dictionary and populate it */ r->spreadsheet.dict = dict_create ( CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->rsd.xtr))); diff --git a/tests/automake.mk b/tests/automake.mk index 4de61417b2..4d75aa84ab 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -274,6 +274,7 @@ tests_output_tex_strings_CFLAGS = $(AM_CFLAGS) -I $(top_srcdir)/src/output EXTRA_DIST += \ tests/coverage.sh \ + tests/data/repeating-2.ods \ tests/data/simple.ods \ tests/data/simple.gnumeric \ tests/data/sparse.ods \ diff --git a/tests/data/repeating-2.ods b/tests/data/repeating-2.ods new file mode 100644 index 0000000000000000000000000000000000000000..711500ab4daa368d38b531ad7fcafc743ad528f7 GIT binary patch literal 10797 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