diff options
| author | Squire <squire@lindenlab.com> | 2011-06-17 11:05:31 -0700 | 
|---|---|---|
| committer | Squire <squire@lindenlab.com> | 2011-06-17 11:05:31 -0700 | 
| commit | f86a488231dc9a629d44a9f6aa6bfc9aa0eb57b4 (patch) | |
| tree | bd203f0865fe19735a0774f60625538856991970 | |
| parent | e35cc6f42b4c02f1d7a05083c3b14de6c222f90a (diff) | |
CHOP-662 - initial fix to problems with regex characters in Group names
causing the LLDirIterator to crash the viewer when opening chat logs
| -rw-r--r-- | indra/llvfs/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/llvfs/lldiriterator.cpp | 21 | ||||
| -rw-r--r-- | indra/llvfs/tests/lldiriterator_test.cpp | 62 | ||||
| -rw-r--r-- | indra/newview/lllogchat.cpp | 2 | 
4 files changed, 81 insertions, 5 deletions
| diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index b6d1ce61e5..f89da4d6c5 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -80,6 +80,7 @@ if (LL_TESTS)  	# UNIT TESTS  	SET(llvfs_TEST_SOURCE_FILES  	  # none so far +	  lldiriterator.cpp  	  )  	LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}") diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 041436ed92..3b132862ad 100644 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -121,6 +121,14 @@ bool LLDirIterator::Impl::next(std::string &fname)  	return found;  } +/* +converts the incoming glob into a regex. This involves +converting incoming glob expressions to regex equivilents and +at the same time, escaping any regex meaningful characters which +do not have glob meaning, i.e. +            .()+|^$  +in the input +*/  std::string glob_to_regex(const std::string& glob)  {  	std::string regex; @@ -135,9 +143,6 @@ std::string glob_to_regex(const std::string& glob)  		switch (c)  		{ -			case '.': -				regex+="\\."; -				break;  			case '*':  				if (glob.begin() == i)  				{ @@ -170,7 +175,15 @@ std::string glob_to_regex(const std::string& glob)  			case '!':  				regex+= square_brace_open ? '^' : c;  				break; -			default: +			case '.': // This collection have different regex meaning +			case '^': // And so need escaping +			case '(':  +			case ')': +			case '+': +			case '|': +			case '$': +                regex+='\\';  +            default:  				regex+=c;  				break;  		} diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp new file mode 100644 index 0000000000..7c2cd49e41 --- /dev/null +++ b/indra/llvfs/tests/lldiriterator_test.cpp @@ -0,0 +1,62 @@ +/** + * @file lldiriterator_test.cpp + * @date 2011-06 + * @brief LLDirIterator test cases. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only., + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "lltut.h" +#include "../lldiriterator.h" + + +namespace tut +{ +     +    struct LLDirIteratorFixture +    { +        LLDirIteratorFixture() +        { +        } +    }; +    typedef test_group<LLDirIteratorFixture> LLDirIteratorTest_factory; +    typedef LLDirIteratorTest_factory::object LLDirIteratorTest_t; +    LLDirIteratorTest_factory tf("LLDirIterator"); + +    /* +    CHOP-662 was originally introduced to deal with crashes deleting files from +    a directory (VWR-25500). However, this introduced a crash looking for  +    old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters +    */ +    void test_chop_662(void) +    { +        LLDirIterator iter(".","+bad-group-name]+??-??.*"); +    } + +    template<> template<> +	void LLDirIteratorTest_t::test<1>() +    { +       test_chop_662(); +    } + +}
\ No newline at end of file diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index efc4e23838..ebb5912ace 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -230,7 +230,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)  std::string LLLogChat::cleanFileName(std::string filename)  { -	std::string invalidChars = "\"\'\\/?*:.<>|"; +    std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars  	std::string::size_type position = filename.find_first_of(invalidChars);  	while (position != filename.npos)  	{ | 
