From 4de373154a9c151264dce1394d00abf95272a7a9 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Mon, 1 May 2017 21:02:22 +0200 Subject: [PATCH] MATRIX DATA: Fix crash when duplicate variables are specified --- src/language/data-io/matrix-data.c | 6 ++++- src/language/lexer/variable-parser.c | 5 ++-- tests/language/data-io/matrix-data.at | 33 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/language/data-io/matrix-data.c b/src/language/data-io/matrix-data.c index fb214fd644..db7c9d05bd 100644 --- a/src/language/data-io/matrix-data.c +++ b/src/language/data-io/matrix-data.c @@ -302,6 +302,8 @@ cmd_matrix (struct lexer *lexer, struct dataset *ds) mformat.triangle = LOWER; mformat.diagonal = DIAGONAL; + mformat.n_split_vars = 0; + mformat.split_vars = NULL; dict = (in_input_program () ? dataset_dict (ds) @@ -324,7 +326,7 @@ cmd_matrix (struct lexer *lexer, struct dataset *ds) lex_match (lexer, T_EQUALS); - if (! parse_mixed_vars (lexer, dict, &names, &n_names, 0)) + if (! parse_mixed_vars (lexer, dict, &names, &n_names, PV_NO_DUPLICATE)) { int i; for (i = 0; i < n_names; ++i) @@ -475,6 +477,7 @@ cmd_matrix (struct lexer *lexer, struct dataset *ds) fh_unref (fh); free (encoding); + free (mformat.split_vars); return CMD_DATA_LIST; @@ -484,6 +487,7 @@ cmd_matrix (struct lexer *lexer, struct dataset *ds) dict_destroy (dict); fh_unref (fh); free (encoding); + free (mformat.split_vars); return CMD_CASCADING_FAILURE; } diff --git a/src/language/lexer/variable-parser.c b/src/language/lexer/variable-parser.c index 9819acbbc1..b91c038ac9 100644 --- a/src/language/lexer/variable-parser.c +++ b/src/language/lexer/variable-parser.c @@ -607,7 +607,6 @@ parse_mixed_vars (struct lexer *lexer, const struct dictionary *dict, assert (names != NULL); assert (nnames != NULL); - assert ((pv_opts & ~PV_APPEND) == 0); if (!(pv_opts & PV_APPEND)) { @@ -621,7 +620,7 @@ parse_mixed_vars (struct lexer *lexer, const struct dictionary *dict, struct variable **v; size_t nv; - if (!parse_variables (lexer, dict, &v, &nv, PV_NONE)) + if (!parse_variables (lexer, dict, &v, &nv, pv_opts)) goto fail; *names = xnrealloc (*names, *nnames + nv, sizeof **names); for (i = 0; i < nv; i++) @@ -629,7 +628,7 @@ parse_mixed_vars (struct lexer *lexer, const struct dictionary *dict, free (v); *nnames += nv; } - else if (!parse_DATA_LIST_vars (lexer, dict, names, nnames, PV_APPEND)) + else if (!parse_DATA_LIST_vars (lexer, dict, names, nnames, PV_APPEND | pv_opts)) goto fail; } if (*nnames == 0) diff --git a/tests/language/data-io/matrix-data.at b/tests/language/data-io/matrix-data.at index 3047b1f57f..727470cefe 100644 --- a/tests/language/data-io/matrix-data.at +++ b/tests/language/data-io/matrix-data.at @@ -242,3 +242,36 @@ s1,s2,ROWTYPE_,VARNAME_,var01,var02,var03 ]) AT_CLEANUP + + + + +AT_SETUP([Matrix data duplicate variable]) + +dnl Negative test to check for sane behaviour in the face of bad syntax +AT_DATA([matrix-data.pspp], [dnl +set decimal = dot . +matrix data + variables = s1 s1 rowtype_ var01 var02 var03 + /split=s1. + +begin data +0 mean 21.4 5.0 72.9 +0 sd 6.5 1.6 22.8 +0 n 106 106 106 +0 corr 1 +0 corr .41 1 +0 corr -.16 -.22 1 +end data . + +list. +]) + + +AT_CHECK([pspp -O format=csv matrix-data.pspp], [1], [dnl +matrix-data.pspp:3: error: MATRIX DATA: Variable s1 appears twice in variable list. + +matrix-data.pspp:6: error: Stopping syntax file processing here to avoid a cascade of dependent command failures. +]) + +AT_CLEANUP -- 2.30.2