Ticket #7165: programs_mythfrontend-pointer-checking

File programs_mythfrontend-pointer-checking, 11.3 KB (added by Erik Hovland <erik@…>, 15 years ago)

Check pointers in mythfrontend

Line 
1Make sure pointers are valid before using them.
2
3From: Erik Hovland <erik@hovland.org>
4
5
6---
7
8 mythtv/libs/libmythui/mythdialogbox.cpp            |    3 +-
9 mythtv/programs/mythfrontend/customedit.cpp        |   11 ++++++--
10 mythtv/programs/mythfrontend/guidegrid.cpp         |   22 +++++++++-------
11 mythtv/programs/mythfrontend/mythcontrols.cpp      |   28 ++++++++++++++++----
12 mythtv/programs/mythfrontend/playbackbox.cpp       |   22 ++++++++--------
13 mythtv/programs/mythfrontend/proglist.cpp          |    7 ++++-
14 .../programs/mythfrontend/programrecpriority.cpp   |    8 ++++++
15 mythtv/programs/mythfrontend/statusbox.cpp         |   12 ++++++---
16 8 files changed, 78 insertions(+), 35 deletions(-)
17
18
19diff --git a/mythtv/libs/libmythui/mythdialogbox.cpp b/mythtv/libs/libmythui/mythdialogbox.cpp
20index a874717..edd5bca 100644
21--- a/mythtv/libs/libmythui/mythdialogbox.cpp
22+++ b/mythtv/libs/libmythui/mythdialogbox.cpp
23@@ -155,7 +155,8 @@ bool MythDialogBox::keyPressEvent(QKeyEvent *event)
24         else if (action == "RIGHT")
25         {
26             MythUIButtonListItem *item = m_buttonList->GetItemCurrent();
27-            Select(item);
28+            if (item)
29+                Select(item);
30         }
31         else
32             handled = false;
33diff --git a/mythtv/programs/mythfrontend/customedit.cpp b/mythtv/programs/mythfrontend/customedit.cpp
34index edd80a4..f1e355a 100644
35--- a/mythtv/programs/mythfrontend/customedit.cpp
36+++ b/mythtv/programs/mythfrontend/customedit.cpp
37@@ -684,9 +684,12 @@ void CustomEdit::storeClicked(void)
38         if (m_clauseList->GetCurrentPos() >= maxex)
39         {
40             MythUIButtonListItem* item = m_clauseList->GetItemCurrent();
41-            str = QString("%1 \"%2\"").arg(QObject::tr("Delete"))
42-                                      .arg(item->GetText());
43-            storediag->AddButton(str);
44+            if (item)
45+            {
46+                str = QString("%1 \"%2\"").arg(QObject::tr("Delete"))
47+                                          .arg(item->GetText());
48+                storediag->AddButton(str);
49+            }
50         }
51         storediag->AddButton(QObject::tr("Cancel"));
52         mainStack->AddScreen(storediag);
53@@ -805,6 +808,8 @@ void CustomEdit::storeRule(bool is_search, bool is_new)
54 void CustomEdit::deleteRule(void)
55 {
56     MythUIButtonListItem* item = m_clauseList->GetItemCurrent();
57+    if (!item)
58+        return;
59 
60     MSqlQuery query(MSqlQuery::InitCon());
61     query.prepare("DELETE FROM customexample "
62diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp
63index 5bbc68a..7c6e7f7 100644
64--- a/mythtv/programs/mythfrontend/guidegrid.cpp
65+++ b/mythtv/programs/mythfrontend/guidegrid.cpp
66@@ -1030,16 +1030,19 @@ void GuideGrid::fillProgramRowInfos(unsigned int row)
67         }
68         else
69         {
70-            if (proginfo == *program)
71+            if (proginfo && proginfo == *program)
72             {
73                 proginfo->spread++;
74             }
75             else
76             {
77                 proginfo = *program;
78-                proginfo->startCol = x;
79-                proginfo->spread = 1;
80-                unknown = false;
81+                if (proginfo)
82+                {
83+                    proginfo->startCol = x;
84+                    proginfo->spread = 1;
85+                    unknown = false;
86+                }
87             }
88         }
89         m_programInfos[row][x] = proginfo;
90@@ -1375,18 +1378,19 @@ void GuideGrid::updateChannels(void)
91             }
92         }
93 
94-        MythUIButtonListItem *item = new MythUIButtonListItem(
95-                m_channelList, chinfo->GetFormatted(m_channelFormat));
96+        MythUIButtonListItem *item =
97+            new MythUIButtonListItem(m_channelList,
98+                                     chinfo ? chinfo->GetFormatted(m_channelFormat) : QString());
99 
100         QString state;
101         if (unavailable)
102             state = (m_changrpid == -1) ? "unavailable" : "favunavailable";
103-        else
104-            state = (m_changrpid == -1) ? "" : "favourite";
105+        else if (m_changrpid != -1)
106+            state = "favourite";
107 
108         item->SetText(chinfo->GetFormatted(m_channelFormat), "buttontext", state);
109 
110-        if (showChannelIcon && !chinfo->icon.isEmpty())
111+        if (showChannelIcon && chinfo && !chinfo->icon.isEmpty())
112         {
113             if (chinfo->CacheChannelIcon())
114             {
115diff --git a/mythtv/programs/mythfrontend/mythcontrols.cpp b/mythtv/programs/mythfrontend/mythcontrols.cpp
116index 998e439..efa0014 100644
117--- a/mythtv/programs/mythfrontend/mythcontrols.cpp
118+++ b/mythtv/programs/mythfrontend/mythcontrols.cpp
119@@ -419,13 +419,21 @@ void MythControls::RefreshKeyInformation(void)
120  */
121 QString MythControls::GetCurrentContext(void)
122 {
123-    if (m_leftListType == kContextList)
124-        return m_leftList->GetItemCurrent()->GetText();
125+    MythUIButtonListItem* currentButton;
126+    if (m_leftListType == kContextList &&
127+        (currentButton = m_leftList->GetItemCurrent()))
128+    {
129+        return currentButton->GetText();
130+    }
131 
132     if (GetFocusWidget() == m_leftList)
133         return QString::null;
134 
135-    QString desc = m_rightList->GetItemCurrent()->GetText();
136+    currentButton = m_rightList->GetItemCurrent();
137+    QString desc;
138+    if (currentButton)
139+        desc = currentButton->GetText();
140+
141     int loc = desc.indexOf(" => ");
142     if (loc == -1)
143         return QString::null; // Should not happen
144@@ -510,8 +518,12 @@ uint MythControls::GetCurrentButton(void)
145  */
146 QString MythControls::GetCurrentKey(void)
147 {
148-    if (m_leftListType == kKeyList)
149-        return m_leftList->GetItemCurrent()->GetText();
150+    MythUIButtonListItem* currentButton;
151+    if (m_leftListType == kKeyList &&
152+        (currentButton = m_leftList->GetItemCurrent()))
153+    {
154+        return currentButton->GetText();
155+    }
156 
157     if (GetFocusWidget() == m_leftList)
158         return QString::null;
159@@ -529,7 +541,11 @@ QString MythControls::GetCurrentKey(void)
160         return QString::null;
161     }
162 
163-    QString desc = m_rightList->GetItemCurrent()->GetText();
164+    currentButton = m_rightList->GetItemCurrent();
165+    QString desc;
166+    if (currentButton)
167+        desc = currentButton->GetText();
168+
169     int loc = desc.indexOf(" => ");
170     if (loc == -1)
171         return QString::null; // Should not happen
172diff --git a/mythtv/programs/mythfrontend/playbackbox.cpp b/mythtv/programs/mythfrontend/playbackbox.cpp
173index 5acbf98..55e0700 100644
174--- a/mythtv/programs/mythfrontend/playbackbox.cpp
175+++ b/mythtv/programs/mythfrontend/playbackbox.cpp
176@@ -242,7 +242,10 @@ ProgramInfo *PlaybackBox::RunPlaybackBox(void * player, bool showTV)
177     if (pbb->Create())
178         mainStack->AddScreen(pbb);
179     else
180+    {
181         delete pbb;
182+        return NULL;
183+    }
184 
185     ProgramInfo *nextProgram = NULL;
186     if (pbb->CurrentItem())
187@@ -1527,8 +1530,8 @@ void PlaybackBox::playSelectedPlaylist(bool random)
188 
189         tmpItem = findMatchingProg(*it);
190 
191-        if ((tmpItem->availableStatus == asAvailable) ||
192-            (tmpItem->availableStatus == asNotYetAvailable))
193+        if (tmpItem && (tmpItem->availableStatus == asAvailable ||
194+            tmpItem->availableStatus == asNotYetAvailable))
195             playNext = play(tmpItem, true);
196 
197         randomList.erase(it);
198@@ -3587,7 +3590,7 @@ void PlaybackBox::previewReady(const ProgramInfo *pginfo)
199 {
200     if (!pginfo)
201         return;
202-   
203+
204     QString xfn = pginfo->pathname + ".png";
205     QString fn = xfn.mid(qMax(xfn.lastIndexOf('/') + 1,0));
206 
207@@ -3601,14 +3604,11 @@ void PlaybackBox::previewReady(const ProgramInfo *pginfo)
208     }
209     m_previewGeneratorLock.unlock();
210 
211-    if (pginfo)
212-    {
213-        QStringList extra;
214-        pginfo->ToStringList(extra);
215-        extra.detach();
216-        MythEvent me("PREVIEW_READY", extra);
217-        gContext->dispatch(me);
218-    }
219+    QStringList extra;
220+    pginfo->ToStringList(extra);
221+    extra.detach();
222+    MythEvent me("PREVIEW_READY", extra);
223+    gContext->dispatch(me);
224 }
225 
226 void PlaybackBox::HandlePreviewEvent(const ProgramInfo &evinfo)
227diff --git a/mythtv/programs/mythfrontend/proglist.cpp b/mythtv/programs/mythfrontend/proglist.cpp
228index 6a9a828..b0e3e0c 100644
229--- a/mythtv/programs/mythfrontend/proglist.cpp
230+++ b/mythtv/programs/mythfrontend/proglist.cpp
231@@ -1192,8 +1192,11 @@ void ProgLister::fillItemList(bool restorePosition)
232     MythUIButtonListItem *currentItem = m_progList->GetItemCurrent();
233     ProgramInfo *selected = NULL;
234     if (currentItem)
235-        selected = new ProgramInfo(*(qVariantValue<ProgramInfo*>
236-                                        (currentItem->GetData())));
237+    {
238+        ProgramInfo* variantProgramInfo = qVariantValue<ProgramInfo*>(currentItem->GetData());
239+        if (variantProgramInfo)
240+            selected = new ProgramInfo(*variantProgramInfo);
241+    }
242     int selectedOffset =
243         m_progList->GetCurrentPos() - m_progList->GetTopItemPos();
244 
245diff --git a/mythtv/programs/mythfrontend/programrecpriority.cpp b/mythtv/programs/mythfrontend/programrecpriority.cpp
246index 14b1c2c..c0b19b0 100644
247--- a/mythtv/programs/mythfrontend/programrecpriority.cpp
248+++ b/mythtv/programs/mythfrontend/programrecpriority.cpp
249@@ -926,6 +926,9 @@ void ProgramRecPriority::remove(void)
250     ProgramRecPriorityInfo *pgRecInfo =
251                         qVariantValue<ProgramRecPriorityInfo*>(item->GetData());
252 
253+    if (!pgRecInfo)
254+        return;
255+
256     RecordingRule *record = new RecordingRule();
257     record->m_recordID = pgRecInfo->recordid;
258     if (!record->Load())
259@@ -1012,6 +1015,8 @@ void ProgramRecPriority::upcoming(void)
260     ProgramRecPriorityInfo *pgRecInfo =
261                         qVariantValue<ProgramRecPriorityInfo*>(item->GetData());
262 
263+    if (!pgRecInfo)
264+        return;
265 
266     if (m_listMatch[pgRecInfo->recordid] > 0)
267     {
268@@ -1059,6 +1064,9 @@ void ProgramRecPriority::changeRecPriority(int howMuch)
269     ProgramRecPriorityInfo *pgRecInfo =
270                         qVariantValue<ProgramRecPriorityInfo*>(item->GetData());
271 
272+    if (!pgRecInfo)
273+        return;
274+
275     int tempRecPriority;
276     // inc/dec recording priority
277     tempRecPriority = pgRecInfo->recpriority + howMuch;
278diff --git a/mythtv/programs/mythfrontend/statusbox.cpp b/mythtv/programs/mythfrontend/statusbox.cpp
279index f9acfe4..8582f96 100644
280--- a/mythtv/programs/mythfrontend/statusbox.cpp
281+++ b/mythtv/programs/mythfrontend/statusbox.cpp
282@@ -187,10 +187,13 @@ bool StatusBox::keyPressEvent(QKeyEvent *event)
283         QString action = actions[i];
284         handled = true;
285 
286-        QString currentItem;
287         QRegExp logNumberKeys( "^[12345678]$" );
288 
289-        currentItem = m_categoryList->GetItemCurrent()->GetText();
290+        MythUIButtonListItem* currentButton = m_categoryList->GetItemCurrent();
291+        QString currentItem;
292+        if (currentButton)
293+            currentItem = currentButton->GetText();
294+
295         handled = true;
296 
297         if (action == "MENU")
298@@ -256,7 +259,10 @@ void StatusBox::clicked(MythUIButtonListItem *item)
299 
300     LogLine logline = qVariantValue<LogLine>(item->GetData());
301 
302-    QString currentItem = m_categoryList->GetItemCurrent()->GetText();
303+    MythUIButtonListItem *currentButton = m_categoryList->GetItemCurrent();
304+    QString currentItem;
305+    if (currentButton)
306+        currentItem = currentButton->GetText();
307 
308     // FIXME: Comparisons against strings here is not great, changing names
309     //        breaks everything and it's inefficient