projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sys-file-reader: Tolerate nominal case size of 0 without warning.
[pspp]
/
src
/
data
/
sys-file-reader.c
diff --git
a/src/data/sys-file-reader.c
b/src/data/sys-file-reader.c
index 57e1dc822c6d655867f1f525d84036e3749d249b..5e5dc8b144f33c81d2b275be66504e62d833b762 100644
(file)
--- a/
src/data/sys-file-reader.c
+++ b/
src/data/sys-file-reader.c
@@
-282,7
+282,7
@@
static bool read_variable_record (struct sfm_reader *,
struct sfm_var_record *);
static bool read_value_label_record (struct sfm_reader *,
struct sfm_value_label_record *);
struct sfm_var_record *);
static bool read_value_label_record (struct sfm_reader *,
struct sfm_value_label_record *);
-static
struct sfm_document_record *
read_document_record (struct sfm_reader *);
+static
bool
read_document_record (struct sfm_reader *);
static bool read_extension_record (struct sfm_reader *, int subtype,
struct sfm_extension_record **);
static bool skip_extension_record (struct sfm_reader *, int subtype);
static bool read_extension_record (struct sfm_reader *, int subtype,
struct sfm_extension_record **);
static bool skip_extension_record (struct sfm_reader *, int subtype);
@@
-297,8
+297,7
@@
static bool read_variable_to_value_pair (struct sfm_reader *,
struct text_record *,
struct variable **var, char **value);
static void text_warn (struct sfm_reader *r, struct text_record *text,
struct text_record *,
struct variable **var, char **value);
static void text_warn (struct sfm_reader *r, struct text_record *text,
- const char *format, ...)
- PRINTF_FORMAT (3, 4);
+ const char *format, ...) PRINTF_FORMAT (3, 4);
static char *text_get_token (struct text_record *,
struct substring delimiters, char *delimiter);
static bool text_match (struct text_record *, char c);
static char *text_get_token (struct text_record *,
struct substring delimiters, char *delimiter);
static bool text_match (struct text_record *, char c);
@@
-501,8
+500,7
@@
read_record (struct sfm_reader *r, int type,
sys_error (r, r->pos, _("Duplicate type 6 (document) record."));
return false;
}
sys_error (r, r->pos, _("Duplicate type 6 (document) record."));
return false;
}
- r->document = read_document_record (r);
- return r->document != NULL;
+ return read_document_record (r);
case 7:
if (!read_int (r, &subtype))
case 7:
if (!read_int (r, &subtype))
@@
-524,7
+522,7
@@
read_record (struct sfm_reader *r, int type,
18. I'm surprised that SPSS puts up with this. */
struct sfm_extension_record *ext;
bool ok = read_extension_record (r, subtype, &ext);
18. I'm surprised that SPSS puts up with this. */
struct sfm_extension_record *ext;
bool ok = read_extension_record (r, subtype, &ext);
- if (ok)
+ if (ok
&& ext
)
ll_push_tail (&r->var_attrs, &ext->ll);
return ok;
}
ll_push_tail (&r->var_attrs, &ext->ll);
return ok;
}
@@
-863,7
+861,7
@@
sfm_decode (struct any_reader *r_, const char *encoding,
amount that the header claims. SPSS version 13 gets this
wrong when very long strings are involved, so don't warn in
that case. */
amount that the header claims. SPSS version 13 gets this
wrong when very long strings are involved, so don't warn in
that case. */
- if (r->header.nominal_case_size
!= -1
+ if (r->header.nominal_case_size
> 0
&& r->header.nominal_case_size != r->n_vars
&& r->info.version_major != 13)
sys_warn (r, -1, _("File header claims %d variable positions but "
&& r->header.nominal_case_size != r->n_vars
&& r->info.version_major != 13)
sys_warn (r, -1, _("File header claims %d variable positions but "
@@
-1230,33
+1228,35
@@
read_value_label_record (struct sfm_reader *r,
return true;
}
return true;
}
-/* Reads a document record from R and returns it. */
-static struct sfm_document_record *
+/* Reads a document record from R. Returns true if successful, false on
+ error. */
+static bool
read_document_record (struct sfm_reader *r)
{
read_document_record (struct sfm_reader *r)
{
- struct sfm_document_record *record;
int n_lines;
int n_lines;
-
- record = pool_malloc (r->pool, sizeof *record);
- record->pos = r->pos;
-
if (!read_int (r, &n_lines))
if (!read_int (r, &n_lines))
- return NULL;
- if (n_lines <= 0 || n_lines >= INT_MAX / DOC_LINE_LENGTH)
+ return false;
+ else if (n_lines == 0)
+ return true;
+ else if (n_lines < 0 || n_lines >= INT_MAX / DOC_LINE_LENGTH)
{
{
- sys_error (r, r
ecord
->pos,
+ sys_error (r, r->pos,
_("Number of document lines (%d) "
"must be greater than 0 and less than %d."),
n_lines, INT_MAX / DOC_LINE_LENGTH);
_("Number of document lines (%d) "
"must be greater than 0 and less than %d."),
n_lines, INT_MAX / DOC_LINE_LENGTH);
- return
NULL
;
+ return
false
;
}
}
+ struct sfm_document_record *record;
+ record = pool_malloc (r->pool, sizeof *record);
+ record->pos = r->pos;
record->n_lines = n_lines;
record->documents = pool_malloc (r->pool, DOC_LINE_LENGTH * n_lines);
if (!read_bytes (r, record->documents, DOC_LINE_LENGTH * n_lines))
record->n_lines = n_lines;
record->documents = pool_malloc (r->pool, DOC_LINE_LENGTH * n_lines);
if (!read_bytes (r, record->documents, DOC_LINE_LENGTH * n_lines))
- return
NULL
;
+ return
false
;
- return record;
+ r->document = record;
+ return true;
}
static bool
}
static bool
@@
-2309,20
+2309,20
@@
parse_attributes (struct sfm_reader *r, struct text_record *text,
text_warn (r, text, _("Error parsing attribute value %s[%d]."),
key, index);
break;
text_warn (r, text, _("Error parsing attribute value %s[%d]."),
key, index);
break;
- }
+ }
length = strlen (value);
length = strlen (value);
- if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'')
+ if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'')
{
value[length - 1] = '\0';
{
value[length - 1] = '\0';
- attribute_add_value (attr, value + 1);
+ attribute_add_value (attr, value + 1);
}
}
- else
+ else
{
text_warn (r, text,
_("Attribute value %s[%d] is not quoted: %s."),
key, index, value);
{
text_warn (r, text,
_("Attribute value %s[%d] is not quoted: %s."),
key, index, value);
- attribute_add_value (attr, value);
+ attribute_add_value (attr, value);
}
/* Was this the last value for this attribute? */
}
/* Was this the last value for this attribute? */
@@
-2464,7
+2464,8
@@
parse_long_string_value_labels (struct sfm_reader *r,
ofs += 4;
/* Parse variable name, width, and number of labels. */
ofs += 4;
/* Parse variable name, width, and number of labels. */
- if (!check_overflow (r, record, ofs, var_name_len + 8))
+ if (!check_overflow (r, record, ofs, var_name_len)
+ || !check_overflow (r, record, ofs, var_name_len + 8))
return;
var_name = recode_string_pool ("UTF-8", dict_encoding,
(const char *) record->data + ofs,
return;
var_name = recode_string_pool ("UTF-8", dict_encoding,
(const char *) record->data + ofs,
@@
-2582,7
+2583,8
@@
parse_long_string_missing_values (struct sfm_reader *r,
ofs += 4;
/* Parse variable name. */
ofs += 4;
/* Parse variable name. */
- if (!check_overflow (r, record, ofs, var_name_len + 1))
+ if (!check_overflow (r, record, ofs, var_name_len)
+ || !check_overflow (r, record, ofs, var_name_len + 1))
return;
var_name = recode_string_pool ("UTF-8", dict_encoding,
(const char *) record->data + ofs,
return;
var_name = recode_string_pool ("UTF-8", dict_encoding,
(const char *) record->data + ofs,
@@
-2996,7
+2998,7
@@
read_variable_to_value_pair (struct sfm_reader *r, struct dictionary *dict,
{
if (!text_read_short_name (r, dict, text, ss_cstr ("="), var))
return false;
{
if (!text_read_short_name (r, dict, text, ss_cstr ("="), var))
return false;
-
+
*value = text_get_token (text, ss_buffer ("\t\0", 2), NULL);
if (*value == NULL)
return false;
*value = text_get_token (text, ss_buffer ("\t\0", 2), NULL);
if (*value == NULL)
return false;
@@
-3052,7
+3054,7
@@
static void
text_warn (struct sfm_reader *r, struct text_record *text,
const char *format, ...)
{
text_warn (struct sfm_reader *r, struct text_record *text,
const char *format, ...)
{
- if (text->n_warnings++ < MAX_TEXT_WARNINGS)
+ if (text->n_warnings++ < MAX_TEXT_WARNINGS)
{
va_list args;
{
va_list args;
@@
-3141,7
+3143,10
@@
text_parse_counted_string (struct sfm_reader *r, struct text_record *text)
static bool
text_match (struct text_record *text, char c)
{
static bool
text_match (struct text_record *text, char c)
{
- if (text->buffer.string[text->pos] == c)
+ if (text->pos >= text->buffer.length)
+ return false;
+
+ if (text->buffer.string[text->pos] == c)
{
text->pos++;
return true;
{
text->pos++;
return true;