about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-09-02 23:38:43 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-09-03 23:02:59 -0700
commitba1f663bbd988ad0c12aacaaa94d9e36b91dac81 (patch)
tree54b7f9777652cf6439e33caa9ed6b823fd6ee240 /src/libstd
parent4f151b388bc55731aa7493ae712e13740aff2380 (diff)
downloadrust-ba1f663bbd988ad0c12aacaaa94d9e36b91dac81.tar.gz
rust-ba1f663bbd988ad0c12aacaaa94d9e36b91dac81.zip
Raise errors on format strings with unmatched `}`
Otherwise extra stuff after a lone '}' character is simply ignored, which is
very bad.

Closes #8938
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/fmt/parse.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libstd/fmt/parse.rs b/src/libstd/fmt/parse.rs
index 4bfa6b5afce..245318c4699 100644
--- a/src/libstd/fmt/parse.rs
+++ b/src/libstd/fmt/parse.rs
@@ -149,6 +149,7 @@ pub struct SelectArm<'self> {
 pub struct Parser<'self> {
     priv input: &'self str,
     priv cur: str::CharOffsetIterator<'self>,
+    priv depth: uint,
 }
 
 impl<'self> iterator::Iterator<Piece<'self>> for Parser<'self> {
@@ -168,6 +169,11 @@ impl<'self> iterator::Iterator<Piece<'self>> for Parser<'self> {
                 self.escape(); // ensure it's a valid escape sequence
                 Some(String(self.string(pos + 1))) // skip the '\' character
             }
+            Some((_, '}')) if self.depth == 0 => {
+                self.cur.next();
+                self.err(~"unmatched `}` found");
+                None
+            }
             Some((_, '}')) | None => { None }
             Some((pos, _)) => {
                 Some(String(self.string(pos)))
@@ -182,6 +188,7 @@ impl<'self> Parser<'self> {
         Parser {
             input: s,
             cur: s.char_offset_iter(),
+            depth: 0,
         }
     }
 
@@ -393,7 +400,9 @@ impl<'self> Parser<'self> {
             if !self.wsconsume('{') {
                 self.err(~"selector must be followed by `{`");
             }
+            self.depth += 1;
             let pieces = self.collect();
+            self.depth -= 1;
             if !self.wsconsume('}') {
                 self.err(~"selector case must be terminated by `}`");
             }
@@ -494,7 +503,9 @@ impl<'self> Parser<'self> {
             if !self.wsconsume('{') {
                 self.err(~"selector must be followed by `{`");
             }
+            self.depth += 1;
             let pieces = self.collect();
+            self.depth -= 1;
             if !self.wsconsume('}') {
                 self.err(~"selector case must be terminated by `}`");
             }