This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR gdb/16999


When GDB reads a nonsensical value for the HISTSIZE environment variable
variable, i.e. one that is non-numeric or negative, GDB then sets its
history size to 0.  This behavior is contrary to that of bash, which
defaults the history size to unlimited in such cases.

This patch makes the behavior of invalid HISTSIZE match that of bash.
When we encounter an invalid HISTSIZE we now set the history size to
unlimited instead of 0.

gdb/ChangeLog:

	PR gdb/16999
	* top.c (init_history): For invalid HISTSIZE, set history size
	to unlimited.

gdb/testsuite/ChangeLog:

	PR gdb/16999
	* gdb.base/histsize-history.exp: New test.
---
 gdb/testsuite/gdb.base/histsize-history.exp | 54 +++++++++++++++++++++++++++++
 gdb/top.c                                   | 16 ++++-----
 2 files changed, 62 insertions(+), 8 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/histsize-history.exp

diff --git a/gdb/testsuite/gdb.base/histsize-history.exp b/gdb/testsuite/gdb.base/histsize-history.exp
new file mode 100644
index 0000000..b7b13cf
--- /dev/null
+++ b/gdb/testsuite/gdb.base/histsize-history.exp
@@ -0,0 +1,54 @@
+# 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 HISTSIZE environment variable
+
+
+# Check that the history size is properly set to SIZE when env(HISTSIZE) is set
+# to HISTSIZE.
+
+proc test_histsize_history_setting { histsize size } {
+    global env
+
+    if [info exists env(HISTSIZE)] {
+        set old_histsize $env(HISTSIZE)
+    }
+    set env(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 [info exists old_histsize] {
+        set env(HISTSIZE) $old_histsize
+    } else {
+        unset env(HISTSIZE)
+    }
+}
+
+test_histsize_history_setting "0" "0"
+test_histsize_history_setting "20" "20"
+test_histsize_history_setting "-5" "unlimited"
+test_histsize_history_setting "not_an_integer" "unlimited"
+test_histsize_history_setting "10zab" "unlimited"
diff --git a/gdb/top.c b/gdb/top.c
index 74e1e07..00fee8d 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1684,15 +1684,15 @@ init_history (void)
   if (tmpenv)
     {
       int var;
+      char *endptr;
 
-      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;
-	}
+      var = strtol (tmpenv, &endptr, 10);
+
+      /* For the sake of consistency with bash, if HISTSIZE is
+	 non-numeric or if HISTSIZE is negative then set our history
+	 size to unlimited.  */
+      if (*endptr != '\0' || var < 0)
+	var = -1;
 
       history_size_setshow_var = var;
     }
-- 
2.4.0.194.gc518059


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]