sys-file-reader: Tolerate missing MRSETS label source value.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 26 Sep 2018 23:24:40 +0000 (16:24 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 26 Sep 2018 23:24:40 +0000 (16:24 -0700)
Bug #54724.
Thanks to Peter Lemenkov <lemenkov@gmail.com> for reporting this bug.

src/data/sys-file-reader.c
tests/data/sys-file-reader.at
utilities/pspp-dump-sav.c

index 1b2d6c2131b996a8e8abf1dc18b10fc259f77187..de5653a3542294206fbc319c0366525a6b89da97 100644 (file)
@@ -1762,7 +1762,12 @@ parse_mrsets (struct sfm_reader *r, const struct sfm_extension_record *record,
             }
 
           number = text_get_token (text, ss_cstr (" "), NULL);
-          if (!strcmp (number, "11"))
+          if (!number)
+            sys_warn (r, record->pos,
+                      _("Missing label source value "
+                        "following `E' at offset %zu in MRSETS record."),
+                      text_pos (text));
+          else if (!strcmp (number, "11"))
             mrset->label_from_var_label = true;
           else if (strcmp (number, "1"))
             sys_warn (r, record->pos,
index d071f37c09f97529d20934181e9635ee2f271010..b8cd4a2650dbc1c2ec2b712a35353b822484cdfc 100644 (file)
@@ -2629,6 +2629,36 @@ warning: `sys-file.sav' near offset 0xd8: Missing space following `E' at offset
 done
 AT_CLEANUP
 
+AT_SETUP([missing label source in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=E ");
+
+dnl Character encoding record.
+7; 20; 1; 12; "windows-1252";
+
+999; 0;
+])
+for variant in be le; do
+  AT_CHECK([sack --$variant sys-file.sack > sys-file.sav])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xd8: Missing label source value following `E' at offset 5 in MRSETS record.
+
+warning: `sys-file.sav' near offset 0xd8: Expecting digit at offset 5 in MRSETS record.
+])
+done
+AT_CLEANUP
+
 AT_SETUP([unexpected label source in mrsets])
 AT_KEYWORDS([sack synthetic system file negative multiple response])
 AT_DATA([sys-file.sack], [dnl
index a10ff148bdc7fa91ce40a45b866ee38099ef6bab..febf500f99ee8a289083d2a4bd0463a303a99589 100644 (file)
@@ -795,7 +795,11 @@ read_mrsets (struct sfm_reader *r, size_t size, size_t count)
             }
 
           number = text_tokenize (text, ' ');
-          if (!strcmp (number, "11"))
+          if (!number)
+            sys_warn (r, "Missing label source value "
+                      "following `E' at offset %zu in MRSETS record",
+                      text_pos (text));
+          else if (!strcmp (number, "11"))
             label_from_var_label = true;
           else if (strcmp (number, "1"))
             sys_warn (r, "Unexpected label source value `%s' "