Tweak the handling of $GDBHISTSIZE edge cases [PR gdb/16999]
authorPatrick Palka <patrick@parcs.ath.cx>
Tue, 12 May 2015 10:50:26 +0000 (06:50 -0400)
committerPatrick Palka <patrick@parcs.ath.cx>
Wed, 17 Jun 2015 18:12:19 +0000 (14:12 -0400)
When GDB reads a nonsensical value for the GDBHISTSIZE environment
variable, i.e. one that is non-numeric or negative, GDB then sets its
history size to 0.  This behavior is annoying and also inconsistent
with the behavior of bash.

This patch makes the behavior of invalid GDBHISTSIZE consistent with how
bash handles HISTSIZE.  When we encounter a null or out-of-range
GDBHISTSIZE (outside of [0, INT_MAX]) we now set the history size to
unlimited instead of 0.  When we encounter a non-numeric GDBHISTSIZE we
do nothing.

gdb/ChangeLog:

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.

gdb/doc/ChangeLog:

PR gdb/16999
* gdb.texinfo (Command History): Mention new GDBHISTSIZE
behavior.

gdb/testsuite/ChangeLog:

PR gdb/16999
* gdb.base/gdbhistsize-history.exp: New test.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/gdbhistsize-history.exp [new file with mode: 0644]
gdb/top.c

index 7d631852aed01fab8e1dfd43798798b9ab2b729f..e1d9349ec8f94ecc156eaf7710240ac0f6427395 100644 (file)
@@ -1,3 +1,10 @@
+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.
index 8b813afc477249b0b726d3c21973f12f7b8a7281..45f9708a8c01dcc1cfd0e1b13d21134a7cf564ae 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -64,7 +64,9 @@
 
 * 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
 
index ed513870a89f1268f02d5d8adf135eb6d91a747c..d38550a4d92447608ac3ab8fd527049d258aff5a 100644 (file)
@@ -1,3 +1,9 @@
+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
index e02f92eb0ebdbd51a5e531aa726be2bb78af1ea9..9889b695c978fcde23f899af1d95b414595674a2 100644 (file)
@@ -22639,10 +22639,11 @@ Stop recording command history in a file.
 @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{!}.
index abb067764c672b0a22f9c9a75606f95a39eda992..0f3749e83504d4ec2f8816b89d799074d7e8d881 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gdb/testsuite/gdb.base/gdbhistsize-history.exp b/gdb/testsuite/gdb.base/gdbhistsize-history.exp
new file mode 100644 (file)
index 0000000..0c3f93f
--- /dev/null
@@ -0,0 +1,70 @@
+# 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"
index 8ff20394cc96312a4915adab1b77a9453786baf7..6ae84ab44991b5065f0dbe3668d3d50637fc7405 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1684,21 +1684,31 @@ init_history (void)
   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);