From 0fc26cafacfff9f53d898bb73495b384b80d6d31 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 23 Jun 2015 10:01:38 -0400 Subject: [PATCH] Fix GDBHISTSIZE test failure on i686 The test test_histsize_history_setting "99999999999999999999999999999999999" "unlimited" was failing on i686 because the condition in init_history() for determining whether to map a large GDBHISTSIZE value to infinity was long var = strtol (tmpenv); if (var > INT_MAX) history_size = unlimited; but this condition is never true on i686 because INT_MAX == LONG_MAX. So in order to properly map large out-of-range values of GDBHISTSIZE to infinity on targets where LONG_MAX > INT_MAX as well as on i686, we have to instead change the above condition to if (var > INT_MAX || (var == INT_MAX && errno == ERANGE)) history_size = unlimited; gdb/ChangeLog: * top.c (init_history): Look at errno after calling strtol to properly map large GDBHISTSIZE values to infinity. --- gdb/ChangeLog | 5 +++++ gdb/top.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5690c2a..99ff2fb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-06-23 Patrick Palka + + * top.c (init_history): Look at errno after calling strtol to + properly map large GDBHISTSIZE values to infinity. + 2015-06-23 Doug Evans * inferior.h (struct inferior_suspend_state): Delete, unused. diff --git a/gdb/top.c b/gdb/top.c index 6ae84ab..77fe096 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -1685,10 +1685,13 @@ init_history (void) if (tmpenv) { long var; + int saved_errno; char *endptr; tmpenv = skip_spaces (tmpenv); + errno = 0; var = strtol (tmpenv, &endptr, 10); + saved_errno = errno; endptr = skip_spaces (endptr); /* If GDBHISTSIZE is non-numeric then ignore it. If GDBHISTSIZE is the @@ -1700,7 +1703,12 @@ init_history (void) ; else if (*tmpenv == '\0' || var < 0 - || var > INT_MAX) + || var > INT_MAX + /* On targets where INT_MAX == LONG_MAX, we have to look at + errno after calling strtol to distinguish between a value that + is exactly INT_MAX and an overflowing value that was clamped + to INT_MAX. */ + || (var == INT_MAX && saved_errno == ERANGE)) history_size_setshow_var = -1; else history_size_setshow_var = var; -- 2.7.4