mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-23 18:24:48 +00:00
Prevent crash in the file browser if the file mask is an invalid regex.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8293 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
1fe005b6c4
commit
7e9788e62d
@ -1,3 +1,12 @@
|
|||||||
|
2004-01-02 Angus Leeming <leeming@lyx.org>
|
||||||
|
|
||||||
|
* FormFiledialog.C (globMatch): prevent crash when using an invalid
|
||||||
|
glob.
|
||||||
|
(getRegex): renamed as glob2regex.
|
||||||
|
|
||||||
|
* FileDialog.C (open): remove the block of old code that splits the
|
||||||
|
filter into a description and a glob using '|' as the delimiter.
|
||||||
|
|
||||||
2003-12-28 Angus Leeming <leeming@lyx.org>
|
2003-12-28 Angus Leeming <leeming@lyx.org>
|
||||||
|
|
||||||
* xforms_helpers.C (read, write): output a diagnostic message if
|
* xforms_helpers.C (read, write): output a diagnostic message if
|
||||||
|
@ -65,14 +65,8 @@ FileDialog::Result const FileDialog::opendir(string const & path, string const &
|
|||||||
FileDialog::Result const FileDialog::open(string const & path, string const & mask, string const & suggested)
|
FileDialog::Result const FileDialog::open(string const & path, string const & mask, string const & suggested)
|
||||||
{
|
{
|
||||||
string filter = mask;
|
string filter = mask;
|
||||||
|
|
||||||
if (mask.empty())
|
|
||||||
filter = _("*");
|
|
||||||
else {
|
|
||||||
rsplit(mask, filter, '|');
|
|
||||||
if (filter.empty())
|
if (filter.empty())
|
||||||
filter = mask;
|
filter = "*";
|
||||||
}
|
|
||||||
|
|
||||||
lyxerr[Debug::GUI] << "filedialog open with path \"" << path << "\", mask \""
|
lyxerr[Debug::GUI] << "filedialog open with path \"" << path << "\", mask \""
|
||||||
<< filter << "\", suggested \"" << suggested << '"' << endl;
|
<< filter << "\", suggested \"" << suggested << '"' << endl;
|
||||||
|
@ -200,7 +200,7 @@ int FileDialog::Private::minh_ = 0;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
boost::regex getRegex(string const & pat)
|
boost::regex glob2regex(string const & pat)
|
||||||
{
|
{
|
||||||
// We massage the pattern a bit so that the usual
|
// We massage the pattern a bit so that the usual
|
||||||
// shell pattern we all are used to will work.
|
// shell pattern we all are used to will work.
|
||||||
@ -217,7 +217,8 @@ boost::regex getRegex(string const & pat)
|
|||||||
|
|
||||||
bool globMatch(string const & a, boost::regex const & reg)
|
bool globMatch(string const & a, boost::regex const & reg)
|
||||||
{
|
{
|
||||||
return boost::regex_match(a, reg);
|
// If the glob is invalid then match everything.
|
||||||
|
return reg.empty() ? true : boost::regex_match(a, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace anon
|
} // namespace anon
|
||||||
@ -251,9 +252,9 @@ void FileDialog::Private::Reread()
|
|||||||
string line, Temp;
|
string line, Temp;
|
||||||
string mode;
|
string mode;
|
||||||
string File = directory_;
|
string File = directory_;
|
||||||
if (File != "/") {
|
if (File != "/")
|
||||||
File = split(File, Temp, '/');
|
File = split(File, Temp, '/');
|
||||||
}
|
|
||||||
while (!File.empty() || !Temp.empty()) {
|
while (!File.empty() || !Temp.empty()) {
|
||||||
string dline = "@b" + line + Temp + '/';
|
string dline = "@b" + line + Temp + '/';
|
||||||
fl_add_browser_line(file_dlg_form_->List, dline.c_str());
|
fl_add_browser_line(file_dlg_form_->List, dline.c_str());
|
||||||
@ -263,7 +264,7 @@ void FileDialog::Private::Reread()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parses all entries of the given subdirectory
|
// Parses all entries of the given subdirectory
|
||||||
boost::regex reg = getRegex(mask_);
|
boost::regex const mask_regex = glob2regex(mask_);
|
||||||
|
|
||||||
time_t curTime = time(0);
|
time_t curTime = time(0);
|
||||||
rewinddir(dir);
|
rewinddir(dir);
|
||||||
@ -348,7 +349,7 @@ void FileDialog::Private::Reread()
|
|||||||
|| fileInfo.isChar()
|
|| fileInfo.isChar()
|
||||||
|| fileInfo.isBlock()
|
|| fileInfo.isBlock()
|
||||||
|| fileInfo.isFifo()) {
|
|| fileInfo.isFifo()) {
|
||||||
if (!globMatch(fname, reg))
|
if (!globMatch(fname, mask_regex))
|
||||||
continue;
|
continue;
|
||||||
} else if (!(isDir = fileInfo.isDir()))
|
} else if (!(isDir = fileInfo.isDir()))
|
||||||
continue;
|
continue;
|
||||||
@ -417,7 +418,10 @@ void FileDialog::Private::SetDirectory(string const & path)
|
|||||||
// SetMask: sets dialog file mask
|
// SetMask: sets dialog file mask
|
||||||
void FileDialog::Private::SetMask(string const & newmask)
|
void FileDialog::Private::SetMask(string const & newmask)
|
||||||
{
|
{
|
||||||
mask_ = newmask;
|
mask_ = trim(newmask);
|
||||||
|
if (mask_.empty())
|
||||||
|
mask_ = "*";
|
||||||
|
|
||||||
fl_set_input(file_dlg_form_->PatBox, mask_.c_str());
|
fl_set_input(file_dlg_form_->PatBox, mask_.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,7 +437,7 @@ void FileDialog::Private::SetInfoLine(string const & line)
|
|||||||
FileDialog::Private::Private()
|
FileDialog::Private::Private()
|
||||||
{
|
{
|
||||||
directory_ = MakeAbsPath(string("."));
|
directory_ = MakeAbsPath(string("."));
|
||||||
mask_ = '*';
|
mask_ = "*";
|
||||||
|
|
||||||
// Creates form if necessary.
|
// Creates form if necessary.
|
||||||
if (!file_dlg_form_) {
|
if (!file_dlg_form_) {
|
||||||
|
Loading…
Reference in New Issue
Block a user