From 6f572fd59164479c03856e52b140b2ec1894463f Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 22 Oct 2015 04:16:21 +0000 Subject: dir.c: glob brace expansion [Fix GH-1061] * dir.c (ruby_brace_expand): glob brace expansion edge case fix. When there are closing braces '}' before a open brace '{' it must be ignored and considered as literal. [ruby-core:71138] [Bug #11609] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52212 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ dir.c | 2 +- test/ruby/test_dir.rb | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 065c5ed3f3..b6f093c239 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Oct 22 13:16:19 2015 Guilherme Reis Campos + + * dir.c (ruby_brace_expand): glob brace expansion edge case fix. + When there are closing braces '}' before a open brace '{' it + must be ignored and considered as literal. + [ruby-core:71138] [Bug #11609] + Thu Oct 22 13:13:49 2015 Nobuyoshi Nakada * io.c (argf_next_argv): check ARGV element type, and try diff --git a/dir.c b/dir.c index 36cdadc0e9..59057b4908 100644 --- a/dir.c +++ b/dir.c @@ -2041,7 +2041,7 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg, if (*p == '{' && nest++ == 0) { lbrace = p; } - if (*p == '}' && --nest <= 0) { + if (*p == '}' && lbrace && --nest == 0) { rbrace = p; break; } diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb index d7a09c65d8..510cbf3104 100644 --- a/test/ruby/test_dir.rb +++ b/test/ruby/test_dir.rb @@ -150,6 +150,11 @@ class TestDir < Test::Unit::TestCase assert_equal([File.join(@root, "a")], Dir.glob(File.join(@root, 'a\\'))) assert_equal(("a".."f").map {|f| File.join(@root, f) }.sort, Dir.glob(File.join(@root, '[abc/def]')).sort) + + open(File.join(@root, "}}{}"), "wb") {} + open(File.join(@root, "}}a"), "wb") {} + assert_equal(%w(}}{} }}a).map {|f| File.join(@root, f)}, Dir.glob(File.join(@root, '}}{\{\},a}'))) + assert_equal(%w(}}{} }}a b c).map {|f| File.join(@root, f)}, Dir.glob(File.join(@root, '{\}\}{\{\},a},b,c}'))) end def test_glob_recursive -- cgit v1.2.3