Subject: Fix range validation of integer commands with "unlimited".
authorPedro Alves <palves@redhat.com>
Fri, 22 Mar 2013 20:25:40 +0000 (20:25 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 22 Mar 2013 20:25:40 +0000 (20:25 +0000)
The range validation added by

  http://sourceware.org/ml/gdb-patches/2013-03/msg00767.html

Changes things to allow setting the command to INT_MAX or UINT_MAX
directly, with signed and unsigned commands respectively.  However,
that went a little bit too far, as in the cases of var_integer and
var_uinteger, those values are actually implementation detail.  It's
better to not expose them in the interface, and have users assume
those values mean "unlimited" too, so to be safer to expand the range
of the commands in the future if we want to.  Yes, it's pedantic, and
it's not likely users actually will do this, but MI frontends and
Python scripts might.

gdb/
2013-03-22  Pedro Alves  <palves@redhat.com>
    Yao Qi  <yao@codesourcery.com>
    Mark Kettenis  <kettenis@gnu.org>

* cli/cli-setshow.c (do_set_command) <var_uinteger>:
Don't let the user set the value to UINT_MAX directly.
<var_integer>: Don't let the user set the value to INT_MAX
directly.

gdb/ChangeLog
gdb/cli/cli-setshow.c

index 26dafe9eada213971efa8516f377b5d0be594ce5..a4027c9e6bde4bc575ca48c39383089bf9bc9cab 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-22  Pedro Alves  <palves@redhat.com>
+           Yao Qi  <yao@codesourcery.com>
+           Mark Kettenis  <kettenis@gnu.org>
+
+       * cli/cli-setshow.c (do_set_command) <var_uinteger>:
+       Don't let the user set the value to UINT_MAX directly.
+       <var_integer>: Don't let the user set the value to INT_MAX
+       directly.
+
 2013-03-22  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * remote.c (remote_unpush_target): New function.
index 95ebbe7b65d860108703285ea957a9207cdf6844..f6123699e52987432edadd87efde6b787df63d93 100644 (file)
@@ -278,7 +278,12 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
 
        if (c->var_type == var_uinteger && val == 0)
          val = UINT_MAX;
-       else if (val > UINT_MAX)
+       else if (val < 0
+                /* For var_uinteger, don't let the user set the value
+                   to UINT_MAX directly, as that exposes an
+                   implementation detail to the user interface.  */
+                || (c->var_type == var_uinteger && val >= UINT_MAX)
+                || (c->var_type == var_zuinteger && val > UINT_MAX))
          error (_("integer %s out of range"), plongest (val));
 
        if (*(unsigned int *) c->var != val)
@@ -300,7 +305,12 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
 
        if (val == 0 && c->var_type == var_integer)
          val = INT_MAX;
-       else if (val > INT_MAX || val < INT_MIN)
+       else if (val < INT_MIN
+                /* For var_integer, don't let the user set the value
+                   to INT_MAX directly, as that exposes an
+                   implementation detail to the user interface.  */
+                || (c->var_type == var_integer && val >= INT_MAX)
+                || (c->var_type == var_zinteger && val > INT_MAX))
          error (_("integer %s out of range"), plongest (val));
 
        if (*(int *) c->var != val)