Author: jilles
Date: Sun Jul 20 20:29:09 2014
New Revision: 268927
URL: http://svnweb.freebsd.org/changeset/base/268927

Log:
  sh: Allow arbitrarily large numbers in break and continue.
  
  The argument is capped to loopnest, so strtol()'s [ERANGE] can be ignored.

Added:
  head/bin/sh/tests/builtins/break6.0   (contents, props changed)
Modified:
  head/bin/sh/eval.c
  head/bin/sh/tests/builtins/Makefile

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c  Sun Jul 20 20:14:15 2014        (r268926)
+++ head/bin/sh/eval.c  Sun Jul 20 20:29:09 2014        (r268927)
@@ -1250,8 +1250,16 @@ bltincmd(int argc, char **argv)
 int
 breakcmd(int argc, char **argv)
 {
-       int n = argc > 1 ? number(argv[1]) : 1;
+       long n;
+       char *end;
 
+       if (argc > 1) {
+               /* Allow arbitrarily large numbers. */
+               n = strtol(argv[1], &end, 10);
+               if (!is_digit(argv[1][0]) || *end != '\0')
+                       error("Illegal number: %s", argv[1]);
+       } else
+               n = 1;
        if (n > loopnest)
                n = loopnest;
        if (n > 0) {

Modified: head/bin/sh/tests/builtins/Makefile
==============================================================================
--- head/bin/sh/tests/builtins/Makefile Sun Jul 20 20:14:15 2014        
(r268926)
+++ head/bin/sh/tests/builtins/Makefile Sun Jul 20 20:29:09 2014        
(r268927)
@@ -14,6 +14,7 @@ FILES+=               break2.0 break2.0.stdout
 FILES+=                break3.0
 FILES+=                break4.4
 FILES+=                break5.4
+FILES+=                break6.0
 FILES+=                builtin1.0
 FILES+=                case1.0
 FILES+=                case2.0

Added: head/bin/sh/tests/builtins/break6.0
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/bin/sh/tests/builtins/break6.0 Sun Jul 20 20:29:09 2014        
(r268927)
@@ -0,0 +1,8 @@
+# $FreeBSD$
+# Per POSIX, this need only work if LONG_MAX > 4294967295.
+
+while :; do
+       break 4294967296
+       echo bad
+       exit 3
+done
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to