projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sys-file-reader: Fix double-free on read of partial record.
[pspp-builds.git]
/
src
/
data
/
sys-file-reader.c
diff --git
a/src/data/sys-file-reader.c
b/src/data/sys-file-reader.c
index 03234c2d66166f60138cd67fa22ca7b7291e581e..aff21d60b884cd7332418d512855899b1d60e6b6 100644
(file)
--- a/
src/data/sys-file-reader.c
+++ b/
src/data/sys-file-reader.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010
, 2011
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
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
@@
-42,7
+42,6
@@
#include "libpspp/array.h"
#include "libpspp/assertion.h"
#include "libpspp/compiler.h"
#include "libpspp/array.h"
#include "libpspp/assertion.h"
#include "libpspp/compiler.h"
-#include "libpspp/hash.h"
#include "libpspp/i18n.h"
#include "libpspp/message.h"
#include "libpspp/misc.h"
#include "libpspp/i18n.h"
#include "libpspp/message.h"
#include "libpspp/misc.h"
@@
-294,7
+293,7
@@
sfm_open_reader (struct file_handle *fh, struct dictionary **dict,
r->file = fn_open (fh_get_file_name (fh), "rb");
if (r->file == NULL)
{
r->file = fn_open (fh_get_file_name (fh), "rb");
if (r->file == NULL)
{
- msg (ME, _("Error opening
\"%s\"
for reading as a system file: %s."),
+ msg (ME, _("Error opening
`%s'
for reading as a system file: %s."),
fh_get_file_name (r->fh), strerror (errno));
goto error;
}
fh_get_file_name (r->fh), strerror (errno));
goto error;
}
@@
-425,7
+424,7
@@
close_reader (struct sfm_reader *r)
{
if (fn_close (fh_get_file_name (r->fh), r->file) == EOF)
{
{
if (fn_close (fh_get_file_name (r->fh), r->file) == EOF)
{
- msg (ME, _("Error closing system file
\"%s\"
: %s."),
+ msg (ME, _("Error closing system file
`%s'
: %s."),
fh_get_file_name (r->fh), strerror (errno));
r->error = true;
}
fh_get_file_name (r->fh), strerror (errno));
r->error = true;
}
@@
-596,7
+595,7
@@
read_variable_record (struct sfm_reader *r, struct dictionary *dict,
/* Check variable name. */
if (name[0] == '$' || name[0] == '#')
/* Check variable name. */
if (name[0] == '$' || name[0] == '#')
- sys_error (r,
"Variable name begins with invalid character `%c'."
,
+ sys_error (r,
_("Variable name begins with invalid character `%c'.")
,
name[0]);
if (!var_is_plausible_name (name, false))
sys_error (r, _("Invalid variable name `%s'."), name);
name[0]);
if (!var_is_plausible_name (name, false))
sys_error (r, _("Invalid variable name `%s'."), name);
@@
-1053,8
+1052,8
@@
read_mrsets (struct sfm_reader *r, size_t size, size_t count,
mrset->type = MRSET_MC;
if (!text_match (text, ' '))
{
mrset->type = MRSET_MC;
if (!text_match (text, ' '))
{
- sys_warn (r, _("Missing space following
'C
' at offset %zu "
- "in MRSETS record"), text_pos (text));
+ sys_warn (r, _("Missing space following
`%c
' at offset %zu "
+ "in MRSETS record"),
'C',
text_pos (text));
break;
}
}
break;
}
}
@@
-1071,8
+1070,8
@@
read_mrsets (struct sfm_reader *r, size_t size, size_t count,
mrset->cat_source = MRSET_COUNTEDVALUES;
if (!text_match (text, ' '))
{
mrset->cat_source = MRSET_COUNTEDVALUES;
if (!text_match (text, ' '))
{
- sys_warn (r, _("Missing space following
'E
' at offset %zu "
- "in MRSETS record"), text_pos (text));
+ sys_warn (r, _("Missing space following
`%c
' at offset %zu "
+ "in MRSETS record"),
'E',
text_pos (text));
break;
}
break;
}
@@
-1080,13
+1079,13
@@
read_mrsets (struct sfm_reader *r, size_t size, size_t count,
if (!strcmp (number, "11"))
mrset->label_from_var_label = true;
else if (strcmp (number, "1"))
if (!strcmp (number, "11"))
mrset->label_from_var_label = true;
else if (strcmp (number, "1"))
- sys_warn (r, _("Unexpected label source value
\"%s\"
"
- "following
'
E' at offset %zu in MRSETS record"),
+ sys_warn (r, _("Unexpected label source value
`%s'
"
+ "following
`
E' at offset %zu in MRSETS record"),
number, text_pos (text));
}
else
{
number, text_pos (text));
}
else
{
- sys_warn (r, _("Missing
'C', 'D', or '
E' at offset %zu "
+ sys_warn (r, _("Missing
`C', `D', or `
E' at offset %zu "
"in MRSETS record."),
text_pos (text));
break;
"in MRSETS record."),
text_pos (text));
break;
@@
-1173,6
+1172,7
@@
read_mrsets (struct sfm_reader *r, size_t size, size_t count,
dict_add_mrset (dict, mrset);
mrset = NULL;
dict_add_mrset (dict, mrset);
mrset = NULL;
+ stringi_set_destroy (&var_names);
}
mrset_destroy (mrset);
close_text_record (r, text);
}
mrset_destroy (mrset);
close_text_record (r, text);
@@
-1502,7
+1502,7
@@
read_value_labels (struct sfm_reader *r,
sys_warn (r, _("Duplicate value label for %g on %s."),
label->value.f, var_get_name (v));
else
sys_warn (r, _("Duplicate value label for %g on %s."),
label->value.f, var_get_name (v));
else
- sys_warn (r, _("Duplicate value label for
\"%.*s\"
on %s."),
+ sys_warn (r, _("Duplicate value label for
`%.*s'
on %s."),
max_width, value_str (&label->value, max_width),
var_get_name (v));
}
max_width, value_str (&label->value, max_width),
var_get_name (v));
}
@@
-1679,11
+1679,11
@@
read_long_string_value_labels (struct sfm_reader *r,
first 255 bytes. The maximum documented length
of a label is 120 bytes so this is more than
generous. */
first 255 bytes. The maximum documented length
of a label is 120 bytes so this is more than
generous. */
- skip_bytes (r,
sizeof label - (label_length + 1)
);
+ skip_bytes (r,
(label_length + 1) - sizeof label
);
}
if (!skip && !var_add_value_label (v, &value, label))
}
if (!skip && !var_add_value_label (v, &value, label))
- sys_warn (r, _("Duplicate value label for
\"%.*s\"
on %s."),
+ sys_warn (r, _("Duplicate value label for
`%.*s'
on %s."),
width, value_str (&value, width), var_get_name (v));
}
}
width, value_str (&value, width), var_get_name (v));
}
}
@@
-1766,11
+1766,11
@@
sys_file_casereader_read (struct casereader *reader, void *r_)
return c;
eof:
return c;
eof:
- case_unref (c);
if (i != 0)
partial_record (r);
if (r->case_cnt != -1)
read_error (reader, r);
if (i != 0)
partial_record (r);
if (r->case_cnt != -1)
read_error (reader, r);
+ case_unref (c);
return NULL;
}
return NULL;
}
@@
-2290,7
+2290,7
@@
sys_msg (struct sfm_reader *r, int class, const char *format, va_list args)
struct string text;
ds_init_empty (&text);
struct string text;
ds_init_empty (&text);
- ds_put_format (&text, "
\"%s\"
near offset 0x%llx: ",
+ ds_put_format (&text, "
`%s'
near offset 0x%llx: ",
fh_get_file_name (r->fh), (long long int) ftello (r->file));
ds_put_vformat (&text, format, args);
fh_get_file_name (r->fh), (long long int) ftello (r->file));
ds_put_vformat (&text, format, args);
@@
-2298,6
+2298,8
@@
sys_msg (struct sfm_reader *r, int class, const char *format, va_list args)
m.severity = msg_class_to_severity (class);
m.where.file_name = NULL;
m.where.line_number = 0;
m.severity = msg_class_to_severity (class);
m.where.file_name = NULL;
m.where.line_number = 0;
+ m.where.first_column = 0;
+ m.where.last_column = 0;
m.text = ds_cstr (&text);
msg_emit (&m);
m.text = ds_cstr (&text);
msg_emit (&m);