From 6e54618d5d1597827a18cd980feb447a84ada32b Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Thu, 16 Jun 2011 11:55:16 +0200 Subject: [PATCH] properly escape special characters in glob pattern --- modules/mol/base/src/impl/query_ast.cc | 15 ++++++++++----- modules/mol/base/src/impl/query_impl.cc | 5 +++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/modules/mol/base/src/impl/query_ast.cc b/modules/mol/base/src/impl/query_ast.cc index 697ff173f..ea96a4858 100644 --- a/modules/mol/base/src/impl/query_ast.cc +++ b/modules/mol/base/src/impl/query_ast.cc @@ -120,6 +120,7 @@ StringOrRegexParam::StringOrRegexParam(): StringOrRegexParam::StringOrRegexParam(const String& s): is_regex_(false),r_(),s_(s) { + String special("[]{}()"); for(String::const_iterator it=s.begin();it!=s.end();++it) { if((*it)=='?' || (*it)=='*') { is_regex_=true; @@ -130,12 +131,16 @@ StringOrRegexParam::StringOrRegexParam(const String& s): if(is_regex_) { std::ostringstream e; for(String::const_iterator it=s.begin();it!=s.end();++it) { - if((*it)=='?') { - e << "."; - } else if((*it)=='*') { - e << ".*"; + + if((*it)=='?' && (it==s.begin() || (*(it-1))!='\\')) { + e << "."; + } else if((*it)=='*' && (it==s.begin() || (*(it-1))!='\\')) { + e << ".*"; } else { - e << *it; + if (special.find(*it)!=String::npos) { + e << '\\'; + } + e << *it; } } //std::cerr << "assembling regex [" << e.str() << "]... "; diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc index cc5f80240..a70cfa813 100644 --- a/modules/mol/base/src/impl/query_impl.cc +++ b/modules/mol/base/src/impl/query_impl.cc @@ -148,7 +148,7 @@ QueryToken QueryLexer::LexNumericToken() { } bool is_ident_or_str(char c) { - static String allowed_chars("_*?"); + static String allowed_chars("_*?\\"); return isalnum(c) || allowed_chars.find_first_of(c)!=String::npos; } @@ -158,7 +158,8 @@ QueryToken QueryLexer::LexIdentOrStringToken() { bool force_string=false; while (current_<query_string_.length() && is_ident_or_str(query_string_[current_])) { - if (query_string_[current_]=='*' || query_string_[current_]=='?') { + if (query_string_[current_]=='*' || query_string_[current_]=='?' || + query_string_[current_]=='\\') { force_string=true; } current_++; -- GitLab