diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-09-02 23:38:43 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-09-03 23:02:59 -0700 |
| commit | ba1f663bbd988ad0c12aacaaa94d9e36b91dac81 (patch) | |
| tree | 54b7f9777652cf6439e33caa9ed6b823fd6ee240 /src/libstd | |
| parent | 4f151b388bc55731aa7493ae712e13740aff2380 (diff) | |
| download | rust-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.rs | 11 |
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 `}`"); } |
