From fb0c1d5d3891f1e9e892335a17ecf39abb85b6a6 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 12 Oct 2014 09:49:49 -0700 Subject: [PATCH] DISPLAY: Fix crash bugs in DISPLAY INDEX and DISPLAY NAMES. Bug #43365. Thanks to Mindaugus for reporting this bug. --- src/language/dictionary/sys-file-info.c | 32 ++++----- tests/language/dictionary/sys-file-info.at | 79 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 18 deletions(-) diff --git a/src/language/dictionary/sys-file-info.c b/src/language/dictionary/sys-file-info.c index bb57825e62..01881a995a 100644 --- a/src/language/dictionary/sys-file-info.c +++ b/src/language/dictionary/sys-file-info.c @@ -433,16 +433,6 @@ display_variables (const struct variable **vl, size_t n, int flags) for (i = 0; i < n; i++) table = table_vpaste (table, describe_variable (vl[i], flags)); -#if 0 - tab_hline (t, flags & ~DF_DICT_INDEX ? TAL_2 : TAL_1, 0, nc - 1, 1); - if (flags) - { - tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, nc - 1, r - 1); - tab_vline (t, TAL_1, 1, 0, r - 1); - } - if (flags & ~DF_DICT_INDEX) - tab_vline (t, TAL_1, nc - 1, 0, r - 1); -#endif table_item_submit (table_item_create (table, NULL /* XXX */, NULL)); } @@ -551,12 +541,8 @@ describe_value_labels (const struct variable *var) return &t->table; } -/* Puts a description of variable V into table T starting at row - R. The variable will be described in the format given by - FLAGS. Returns the next row available for use in the - table. */ static struct table * -describe_variable (const struct variable *v, int flags) +describe_variable_details (const struct variable *v, int flags) { struct table *table; struct string s; @@ -670,11 +656,21 @@ describe_variable (const struct variable *v, int flags) table, table_create_nested (describe_attributes (attrs, flags))); } - if (table == NULL) - table = table_from_string (TAB_LEFT, ""); + return table ? table : table_from_string (TAB_LEFT, ""); +} + +/* Puts a description of variable V into table T starting at row + R. The variable will be described in the format given by + FLAGS. Returns the next row available for use in the + table. */ +static struct table * +describe_variable (const struct variable *v, int flags) +{ + struct table *table; + table = flags & ~DF_DICT_INDEX ? describe_variable_details (v, flags) : NULL; table = table_hpaste (table_from_string (0, var_get_name (v)), - table_stomp (table)); + table ? table_stomp (table) : NULL); if (flags & DF_DICT_INDEX) { char s[INT_BUFSIZE_BOUND (size_t)]; diff --git a/tests/language/dictionary/sys-file-info.at b/tests/language/dictionary/sys-file-info.at index d7f4c3fa57..4402cd598e 100644 --- a/tests/language/dictionary/sys-file-info.at +++ b/tests/language/dictionary/sys-file-info.at @@ -46,3 +46,82 @@ Display Alignment: Left Display Width: 10",2 ]) AT_CLEANUP + +AT_BANNER([DISPLAY]) + +dnl DISPLAY DOCUMENTS is tested with commands for documents. + +AT_SETUP([DISPLAY FILE LABEL]) +AT_DATA([display.sps], [dnl +DATA LIST LIST NOTABLE /x * name (a10) . + +DISPLAY FILE LABEL. + +FILE LABEL 'foo bar baz quux'. +DISPLAY FILE LABEL. +]) +AT_CHECK([pspp -O format=csv display.sps], [0], [dnl +The active dataset does not have a file label. + +File label: foo bar baz quux +]) +AT_CLEANUP + +dnl DISPLAY VECTORS is tested with commands for vectors. + +dnl DISPLAY ATTRIBUTES and @ATTRIBUTES are tested with commands for attributes. + +AT_SETUP([DISPLAY SCRATCH]) +AT_DATA([sysfile-info.sps], [dnl +DATA LIST LIST NOTABLE /x * name (a10) . +DISPLAY SCRATCH. +COMPUTE #x=0. +DISPLAY SCRATCH. +]) +AT_CHECK([pspp -O format=csv sysfile-info.sps], [0], [dnl +sysfile-info.sps:2: warning: DISPLAY: No variables to display. + +Variable +#x +]) +AT_CLEANUP + +AT_SETUP([DISPLAY INDEX]) +AT_DATA([sysfile-info.sps], [dnl +DATA LIST LIST NOTABLE /x * name (a10) . +DISPLAY INDEX. +]) +AT_CHECK([pspp -O format=csv sysfile-info.sps], [0], [dnl +Variable,Position +x,1 +name,2 +]) +AT_CLEANUP + +AT_SETUP([DISPLAY NAMES]) +AT_DATA([sysfile-info.sps], [dnl +DATA LIST LIST NOTABLE /x * name (a10) . +DISPLAY NAMES. +]) +AT_CHECK([pspp -O format=csv sysfile-info.sps], [0], [dnl +Variable +x +name +]) +AT_CLEANUP + +AT_SETUP([DISPLAY LABELS]) +AT_DATA([sysfile-info.sps], [dnl +DATA LIST LIST NOTABLE /x * name (a10) . +VARIABLE LABEL x 'variable one' name 'variable two'. +VALUE LABEL x 1 'asdf' 2 'jkl;'. +DISPLAY LABELS. +]) +AT_CHECK([pspp -O format=csv sysfile-info.sps], [0], [dnl +Variable,Label,Position +x,variable one,1 +name,variable two,2 +]) +AT_CLEANUP + +dnl DISPLAY VARIABLES Is tested in multiple places. -- 2.30.2