+2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
+
+       PR gdb/16999
+       * NEWS: Mention new GDBHISTSIZE behavior.
+       * top.c (init_history): For null or out-of-range GDBHISTSIZE,
+       set history size to unlimited.  Ignore non-numeric GDBHISTSIZE.
+
 2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
 
        * NEWS: Mention that GDBHISTSIZE is read instead of HISTSIZE.
 
 
 * The HISTSIZE environment variable is no longer read when determining
   the size of GDB's command history.  GDB now instead reads the dedicated
-  GDBHISTSIZE environment variable.
+  GDBHISTSIZE environment variable.  Setting GDBHISTSIZE to "-1" or to "" now
+  disables truncation of command history.  Non-numeric values of GDBHISTSIZE
+  are ignored.
 
 * Guile Scripting
 
 
+2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
+
+       PR gdb/16999
+       * gdb.texinfo (Command History): Mention new GDBHISTSIZE
+       behavior.
+
 2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
 
        * gdb.texinfo (Command History): Replace occurrences of HISTSIZE
 
 @item set history size @var{size}
 @itemx set history size unlimited
 Set the number of commands which @value{GDBN} keeps in its history list.
-This defaults to the value of the environment variable
-@code{GDBHISTSIZE}, or to 256 if this variable is not set.  If @var{size}
-is @code{unlimited}, the number of commands @value{GDBN} keeps in the
-history list is unlimited.
+This defaults to the value of the environment variable @env{GDBHISTSIZE}, or
+to 256 if this variable is not set.  Non-numeric values of @env{GDBHISTSIZE}
+are ignored.  If @var{size} is @code{unlimited} or if @env{GDBHISTSIZE} is a
+negative number, the number of commands @value{GDBN} keeps in the history list
+is unlimited.
 @end table
 
 History expansion assigns special meaning to the character @kbd{!}.
 
+2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
+
+       PR gdb/16999
+       * gdb.base/gdbhistsize-history.exp: New test.
+
 2015-06-17  Patrick Palka  <patrick@parcs.ath.cx>
 
        * gdb.base/gdbinit-history.exp: Replace occurrences of HISTSIZE
 
--- /dev/null
+# Copyright 2015 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+# Test the setting of "history size" via the GDBHISTSIZE environment variable
+
+
+# Check that the history size is properly set to SIZE when the environment
+# variable ENV_VAR is set to GDBHISTSIZE.
+
+proc test_histsize_history_setting { histsize size { env_var "GDBHISTSIZE" } } {
+    global env
+
+    set have_old_gdbhistsize 0
+    if [info exists env($env_var)] {
+        set have_old_gdbhistsize 1
+        set old_gdbhistsize $env($env_var)
+    }
+    set env($env_var) $histsize
+
+    with_test_prefix "histsize=$histsize" {
+       gdb_exit
+       gdb_start
+
+       gdb_test "show history size" "The size of the command history is $size."
+
+       if { $size == "0" } {
+           gdb_test_no_output "show commands"
+       } elseif { $size != "1" } {
+           gdb_test "show commands" \
+                    "    .  show history size\r\n    .  show commands"
+       }
+
+       if { $have_old_gdbhistsize } {
+           set env($env_var) $old_gdbhistsize
+       } else {
+           unset env($env_var)
+       }
+    }
+}
+
+test_histsize_history_setting "" "unlimited"
+test_histsize_history_setting "0" "0"
+test_histsize_history_setting "20" "20"
+test_histsize_history_setting " 20 " "20"
+test_histsize_history_setting "-5" "unlimited"
+
+# Test defaulting to 256 upon encountering a non-numeric GDBHISTSIZE.
+test_histsize_history_setting "not_an_integer" "256"
+test_histsize_history_setting "10zab" "256"
+test_histsize_history_setting "-5ab" "256"
+
+# A huge number (hopefully larger than INT_MAX)
+test_histsize_history_setting "99999999999999999999999999999999999" "unlimited"
+
+# We no longer read HISTSIZE
+test_histsize_history_setting "50" "256" "HISTSIZE"
 
   tmpenv = getenv ("GDBHISTSIZE");
   if (tmpenv)
     {
-      int var;
-
-      var = atoi (tmpenv);
-      if (var < 0)
-       {
-         /* Prefer ending up with no history rather than overflowing
-            readline's history interface, which uses signed 'int'
-            everywhere.  */
-         var = 0;
-       }
-
-      history_size_setshow_var = var;
+      long var;
+      char *endptr;
+
+      tmpenv = skip_spaces (tmpenv);
+      var = strtol (tmpenv, &endptr, 10);
+      endptr = skip_spaces (endptr);
+
+      /* If GDBHISTSIZE is non-numeric then ignore it.  If GDBHISTSIZE is the
+        empty string, a negative number or a huge positive number (larger than
+        INT_MAX) then set the history size to unlimited.  Otherwise set our
+        history size to the number we have read.  This behavior is consistent
+        with how bash handles HISTSIZE.  */
+      if (*endptr != '\0')
+       ;
+      else if (*tmpenv == '\0'
+              || var < 0
+              || var > INT_MAX)
+       history_size_setshow_var = -1;
+      else
+       history_size_setshow_var = var;
     }
-  /* If the init file hasn't set a size yet, pick the default.  */
-  else if (history_size_setshow_var == -2)
+
+  /* If neither the init file nor GDBHISTSIZE has set a size yet, pick the
+     default.  */
+  if (history_size_setshow_var == -2)
     history_size_setshow_var = 256;
 
   set_readline_history_size (history_size_setshow_var);