From 6363022343d69fa3662e5043aad2dd0e33eb790f Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@cs.stanford.edu>
Date: Sun, 21 Feb 2016 11:51:05 -0800
Subject: [PATCH] Fix several cases where lex_integer() or lex_number() could
 assert-fail.

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 | 24 ++++++++++++++++++------
 src/language/stats/examine.c    |  2 ++
 src/language/stats/npar.c       |  4 +++-
 3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c
index 995be8e7ce..f2c294264c 100644
--- a/src/language/data-io/get-data.c
+++ b/src/language/data-io/get-data.c
@@ -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)
 		{
diff --git a/src/language/stats/examine.c b/src/language/stats/examine.c
index dc0d6c5bee..20cd2f4518 100644
--- a/src/language/stats/examine.c
+++ b/src/language/stats/examine.c
@@ -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)
diff --git a/src/language/stats/npar.c b/src/language/stats/npar.c
index 5d8d8742f9..d89eb0b876 100644
--- a/src/language/stats/npar.c
+++ b/src/language/stats/npar.c
@@ -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);
                 }
-- 
2.30.2