From 3bb0d2c7d129ee6dd489a67ffd396657db420d32 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Thu, 31 Jan 2013 15:06:26 +0000 Subject: [PATCH] Hopefully fix a rare segfault in MythUITextEdit when using mythmusic. I'm guessing but by no means certain that a linked copy of the string was altered in another thread, e.g. the metadata or playlist load thread. QString uses shallow copies and isn't threadsafe. detaching the string may use more memory but that's preferable to crashing. --- mythtv/libs/libmythui/mythuitext.cpp | 5 ++++- mythtv/libs/libmythui/mythuitextedit.cpp | 8 ++++++++ mythtv/libs/libmythui/mythuitextedit.h | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mythtv/libs/libmythui/mythuitext.cpp b/mythtv/libs/libmythui/mythuitext.cpp index 074fff0fc06..0c18fd934ce 100644 --- a/mythtv/libs/libmythui/mythuitext.cpp +++ b/mythtv/libs/libmythui/mythuitext.cpp @@ -128,6 +128,7 @@ void MythUIText::Reset() void MythUIText::SetText(const QString &text) { QString newtext = text; + newtext.detach(); if (!m_Layouts.isEmpty() && newtext == m_Message) return; @@ -203,7 +204,9 @@ void MythUIText::SetTextFromMap(QHash &map) QString MythUIText::GetText(void) const { - return m_Message; + QString ret = m_Message; + ret.detach(); + return ret; } QString MythUIText::GetDefaultText(void) const diff --git a/mythtv/libs/libmythui/mythuitextedit.cpp b/mythtv/libs/libmythui/mythuitextedit.cpp index 1bd65684178..4e00f97038e 100644 --- a/mythtv/libs/libmythui/mythuitextedit.cpp +++ b/mythtv/libs/libmythui/mythuitextedit.cpp @@ -219,6 +219,7 @@ void MythUITextEdit::SetText(const QString &text, bool moveCursor) return; m_Message = text; + m_Message.detach(); if (m_isPassword) { @@ -236,6 +237,13 @@ void MythUITextEdit::SetText(const QString &text, bool moveCursor) emit valueChanged(); } +QString MythUITextEdit::GetText(void) const +{ + QString ret = m_Message; + ret.detach(); + return ret; +} + void MythUITextEdit::InsertText(const QString &text) { if (!m_Text) diff --git a/mythtv/libs/libmythui/mythuitextedit.h b/mythtv/libs/libmythui/mythuitextedit.h index aed23448ee5..1b1c21db5fd 100644 --- a/mythtv/libs/libmythui/mythuitextedit.h +++ b/mythtv/libs/libmythui/mythuitextedit.h @@ -43,7 +43,7 @@ class MUI_PUBLIC MythUITextEdit : public MythUIType, public StorageUser void SetText(const QString &text, bool moveCursor = true); void InsertText(const QString &text); - QString GetText(void) const { return m_Message; } + QString GetText(void) const; void SetFilter(InputFilter filter) { m_Filter = filter; } void SetPassword(bool isPassword) { m_isPassword = isPassword; }