Bennett Helm wrote:
> On Nov 14, 2006, at 1:41 PM, Georg Baum wrote:
>
>> Am Dienstag, 14. November 2006 19:08 schrieb Peter Kümmel:
>>> Peter Kümmel wrote:
>>>> Bennett Helm wrote:
>>>>> Recipe for another crash (1.5 on Mac).
>>>>>
>>>>> Create a document with a bibliography that specifies two .bib files.
>>>>> Select View > View Source, and check the "Display complete source"
>>>>> option. Back in the main LyX window, start typing text in a standard
>>>>> paragraph. After a few keystrokes, LyX crashes.
>>>>>
>>>>> As you begin typing, looking at the LaTeX Source window reveals that
>> the
>>>>> names of the files listed in \Bibliography change as you type.
>>>>>
>>>>> Here's the backtrace.
>>>>>
>>>>> Bennett
>>>>>
>>>>
>>>> Similar here on Windows:
>>>>
>>>> 1. new document
>>>> 2. insert List/TOC->Bibtex Bilio
>>>> 3. add a biblio
>>>> 4. view source ->crash
>>>>
>>>
>>>
>>> This fixes the crash here:
>>>
>>> Index: insets/insetbibtex.C
>>> ===================================================================
>>> --- insets/insetbibtex.C (revision 15916)
>>> +++ insets/insetbibtex.C (working copy)
>>> @@ -155,7 +155,8 @@
>>> typedef boost::tokenizer<Separator> Tokenizer;
>>>
>>> Separator const separator(",");
>>> - Tokenizer const tokens(to_utf8(getParam("bibfiles")),
>>> separator);
>>> + const string param(to_utf8(getParam("bibfiles")));
>>> + Tokenizer const tokens(param, separator);
>>> Tokenizer::const_iterator const begin = tokens.begin();
>>> Tokenizer::const_iterator const end = tokens.end();
>>>
>>>
>>> But why is it needed?
>>> Why is the string deconstructed while passed as parameter?
>>>
>>> std::string const to_utf8(docstring const & ucs4)
>>> {
>>> std::vector<char> const utf8 =
>>> ucs4_to_utf8(ucs4.data(), ucs4.size());
>>> return std::string(utf8.begin(), utf8.end());
>>> }
>>>
>>> Isn't this deep copying?
>>
>> Yes, it is.
>>
>>> There could be hundreds of such constructs in LyX.
>>> This is really a ugly bug.
>>
>> Indeed. Does the attached patch work for you? If yes I would prefer that,
>> since we should convert all filename stuff to docstring eventually and
>> use
>> one place where that is converted to the encoding that is actually usesd
>> by the file system. I don't get the crash with or without the patch.
>
> It seems to make it somewhat harder to trigger (more typing is required
> before the crash), but I still get the crash.
>
> I'm attaching the new backtrace, though at a quick glance it looks the
> same as the old one.
>
> Bennett
Does this patch help? (revert before applying)
>
> terminate called after throwing an instance of
> 'boost::filesystem::basic_filesystem_error<boost::filesystem::basic_path<std::string,
> boost::filesystem::path_traits> >'
> what(): boost::filesystem::exists
>
> Program received signal SIGABRT, Aborted.
> 0x9003d1dc in kill ()
> (gdb) bt
> #0 0x9003d1dc in kill ()
> #1 0x9010f2af in raise ()
> #2 0x9010de02 in abort ()
> #3 0x90b4039c in __gnu_cxx::__verbose_terminate_handler ()
> #4 0x90b3e602 in __gxx_personality_v0 ()
> #5 0x90b3e640 in std::terminate ()
> #6 0x90b3e754 in __cxa_throw ()
> #7 0x00653f32 in
> boost::throw_exception<boost::filesystem::basic_filesystem_error<boost::filesystem::basic_path<std::string,
> boost::filesystem::path_traits> > > ([EMAIL PROTECTED]) at
> ../boost/boost/throw_exception.hpp:39
> #8 0x006563dd in
> boost::filesystem::exists<boost::filesystem::basic_path<std::string,
> boost::filesystem::path_traits> > ([EMAIL PROTECTED]) at
> ../boost/boost/filesystem/operations.hpp:281
> #9 0x000fabac in lyx::support::isFileReadable ([EMAIL PROTECTED]) at
> ../../boost/boost/filesystem/operations.hpp:600
> #10 0x000f48f3 in lyx::(anonymous namespace)::normalize_name
> ([EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED]) at insetbibtex.C:120
> #11 0x000f5dce in lyx::InsetBibtex::latex (this=0x1e8f9e60,
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]) at
> insetbibtex.C:166
> #12 0x000b6607 in lyx::Paragraph::Pimpl::simpleTeXSpecialChars
> (this=0x1e88bed0, [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], c=2097153) at paragraph_pimpl.C:519
> #13 0x000b32e5 in lyx::Paragraph::simpleTeXOnePar (this=0x1e80b808,
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]) at
> paragraph.C:1029
> #14 0x000a85ed in lyx::(anonymous namespace)::TeXOnePar
> ([EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED]) at output_latex.C:373
> #15 0x000ab400 in lyx::latexParagraphs ([EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> [EMAIL PROTECTED], [EMAIL PROTECTED]) at output_latex.C:618
> #16 0x00030fac in lyx::Buffer::writeLaTeXSource (this=0x1e855830,
> [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
> output_preamble=true, output_body=true) at buffer.C:970
> #17 0x00033fca in lyx::Buffer::getSourceCode (this=0x1e855830,
> [EMAIL PROTECTED], par_begin=2, par_end=3, full_source=1) at buffer.C:1668
> #18 0x00372b20 in lyx::frontend::ControlViewSource::updateContent
> (this=0x1e8b30b0, fullSource=true) at ControlViewSource.C:56
> #19 0x0035f4ab in lyx::frontend::QViewSource::update_source
> (this=0x1f2058f0) at QViewSource.C:107
> #20 0x0035f5f6 in lyx::frontend::QViewSource::update_contents
> (this=0x1f2058f0) at QViewSource.C:115
> #21 0x0089351a in
> lyx::frontend::QView<lyx::frontend::QViewSourceDialog>::update
> (this=0x1f2058f0) at QDialogView.h:132
> #22 0x0016f4f9 in lyx::Dialogs::checkStatus (this=0x129652d0) at
> Dialogs.C:248
> #23 0x00164b4b in lyx::LyXView::updateToolbars (this=0x12964734) at
> LyXView.C:304
> #24 0x000870cd in lyx::LyXFunc::dispatch (this=0x12917ac0,
> [EMAIL PROTECTED]) at lyxfunc.C:1742
> #25 0x000881c6 in lyx::LyXFunc::processKeySym (this=0x12917ac0,
> [EMAIL PROTECTED], state=none) at lyxfunc.C:336
> #26 0x001d1bc5 in lyx::frontend::WorkArea::processKeySym
> (this=0x12965994, [EMAIL PROTECTED], state=none) at WorkArea.C:175
> #27 0x003250d9 in lyx::frontend::GuiWorkArea::keyPressEvent
> (this=0x12965980, e=0xbfffeccc) at GuiWorkArea.C:443
> #28 0x0020a2a2 in QWidget::event () at QLImage.C:172
> #29 0x0025f1f4 in QFrame::event () at Dialogs.C:320
> #30 0x00246d9b in QAbstractScrollArea::event () at Dialogs.C:320
> #31 0x00181fc0 in QApplicationPrivate::notify_helper () at
> insetspecialchar.C:65
> #32 0x001881be in QApplication::notify () at insetspecialchar.C:65
> #33 0x001e1a80 in qt_sendSpontaneousEvent () at forkedcontr.C:223
> #34 0x002ee836 in QKeyMapper::sendKeyEvent () at InsetMathString.C:33
> #35 0x002efd1e in QKeyMapperPrivate::translateKeyEvent () at
> InsetMathString.C:33
> #36 0x001e44e2 in QApplicationPrivate::globalEventProcessor () at
> forkedcontr.C:223
> #37 0x92dc686b in DispatchEventToHandlers ()
> #38 0x92dc5f10 in SendEventToEventTargetInternal ()
> #39 0x92dc5dd5 in SendEventToEventTargetWithOptions ()
> #40 0x92dcd858 in ToolboxEventDispatcherHandler ()
> #41 0x92dc6c22 in DispatchEventToHandlers ()
> #42 0x92dc5f10 in SendEventToEventTargetInternal ()
> #43 0x92dcd1f0 in SendEventToEventTarget ()
> #44 0x001dccac in qt_mac_send_event () at forkedcontr.C:223
> #45 0x002f7584 in QEventDispatcherMac::processEvents () at
> InsetMathString.C:33
> #46 0x0031243a in QEventLoop::processEvents () at InsetMathString.C:33
> #47 0x00312618 in QEventLoop::exec () at InsetMathString.C:33
> #48 0x001e9967 in QCoreApplication::exec () at forkedcontr.C:223
> #49 0x00074dfa in lyx::LyX::priv_exec (this=0x12917ab0,
> [EMAIL PROTECTED], argv=0xbffff9e4) at lyx_main.C:350
> #50 0x00074f56 in lyx::LyX::exec ([EMAIL PROTECTED], argv=0xbffff9e4) at
> lyx_main.C:171
> #51 0x00002bbd in main (argc=1, argv=0xbffff9e4) at main.C:46
>
--
Peter Kümmel
Index: src/insets/insetbibtex.C
===================================================================
--- src/insets/insetbibtex.C (revision 15916)
+++ src/insets/insetbibtex.C (working copy)
@@ -151,19 +151,21 @@
// use such filenames.)
// Otherwise, store the (maybe absolute) path to the original,
// unmangled database name.
- typedef boost::char_separator<char> Separator;
- typedef boost::tokenizer<Separator> Tokenizer;
+ typedef boost::char_separator<char_type> Separator;
+ typedef boost::tokenizer<Separator, docstring::const_iterator,
docstring> Tokenizer;
- Separator const separator(",");
- Tokenizer const tokens(to_utf8(getParam("bibfiles")), separator);
+ Separator const separator(from_ascii(",").c_str());
+ Tokenizer const tokens(getParam("bibfiles"), separator);
Tokenizer::const_iterator const begin = tokens.begin();
Tokenizer::const_iterator const end = tokens.end();
- std::ostringstream dbs;
+ odocstringstream dbs;
for (Tokenizer::const_iterator it = begin; it != end; ++it) {
- string const input = trim(*it);
+ docstring const input = trim(*it);
+ // FIXME UNICODE
+ string utf8input(to_utf8(input));
string database =
- normalize_name(buffer, runparams, input, ".bib");
+ normalize_name(buffer, runparams, utf8input, ".bib");
string const in_file = database + ".bib";
if (!runparams.inComment && !runparams.dryrun &&
!runparams.nice &&
@@ -184,10 +186,10 @@
if (it != begin)
dbs << ',';
- dbs << latex_path(database);
+ // FIXME UNICODE
+ dbs << from_utf8(latex_path(database));
}
- // FIXME UNICODE
- docstring const db_out = from_utf8(dbs.str());
+ docstring const db_out = dbs.str();
// Post this warning only once.
static bool warned_about_spaces = false;