CHOP-662 - initial fix to problems with regex characters in Group names
causing the LLDirIterator to crash the viewer when opening chat logsmeow-7.2.2
parent
e35cc6f42b
commit
f86a488231
|
|
@ -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}")
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue