Fix several cases where lex_integer() or lex_number() could assert-fail.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 21 Feb 2016 19:51:05 +0000 (11:51 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 21 Feb 2016 19:51:05 +0000 (11:51 -0800)
The caller always needs to make sure in advance that the token is in fact
an integer or a number.

src/language/data-io/get-data.c
src/language/stats/examine.c
src/language/stats/npar.c

index 995be8e7ce896212cd9775af4789c1aa1441360a..f2c294264ce951c5e66597d5a66cd0cfd55f8e69 100644 (file)
@@ -174,14 +174,20 @@ parse_get_psql (struct lexer *lexer, struct dataset *ds)
       if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH"))
        {
          lex_match (lexer, T_EQUALS);
-         psql.str_width = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              psql.str_width = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if ( lex_match_id (lexer, "BSIZE"))
        {
          lex_match (lexer, T_EQUALS);
-         psql.bsize = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              psql.bsize = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if ( lex_match_id (lexer, "UNENCRYPTED"))
        {
@@ -250,8 +256,11 @@ parse_spreadsheet (struct lexer *lexer, char **filename,
       if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH"))
        {
          lex_match (lexer, T_EQUALS);
-         opts->asw = lex_integer (lexer);
-         lex_get (lexer);
+          if (lex_force_int (lexer))
+            {
+              opts->asw = lex_integer (lexer);
+              lex_get (lexer);
+            }
        }
       else if (lex_match_id (lexer, "SHEET"))
        {
@@ -268,6 +277,9 @@ parse_spreadsheet (struct lexer *lexer, char **filename,
            }
          else if (lex_match_id (lexer, "INDEX"))
            {
+              if (!lex_force_int (lexer))
+                goto error;
+
              opts->sheet_index = lex_integer (lexer);
              if (opts->sheet_index <= 0)
                {
index dc0d6c5beecfe4a160105e3fbbf2729631c5c7bd..20cd2f45189cd32a341f15c7b2e74e8c7367d51d 100644 (file)
@@ -1999,6 +1999,8 @@ cmd_examine (struct lexer *lexer, struct dataset *ds)
                   int extr = 5;
                   if (lex_match (lexer, T_LPAREN))
                     {
+                      if (!lex_force_int (lexer))
+                        goto error;
                       extr = lex_integer (lexer);
 
                       if (extr < 0)
index 5d8d8742f9c51935a32966c17b7722e3acb59344..d89eb0b876d63889f9a796b81b2a34f8daac3e29 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis. -*-c-*-
-   Copyright (C) 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2008, 2009, 2010, 2011, 2016 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
@@ -865,6 +865,8 @@ npar_chisquare (struct lexer *lexer, struct dataset *ds,
               if ( lex_match (lexer, T_ASTERISK))
                 {
                   n = f;
+                  if (!lex_force_num (lexer))
+                    return 0;
                   f = lex_number (lexer);
                   lex_get (lexer);
                 }