Skip to content

Commit f4c930a

Browse files
bugfix(gui): Prevent null pointer dereference in GadgetPushButton message sending
1 parent 8503c3b commit f4c930a

2 files changed

Lines changed: 62 additions & 44 deletions

File tree

Generals/Code/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
8787
{
8888
BitSet( instData->m_state, WIN_STATE_HILITED );
8989

90-
TheWindowManager->winSendSystemMsg( instData->getOwner(),
91-
GBM_MOUSE_ENTERING,
92-
(WindowMsgData)window,
93-
mData1 );
90+
if( instData->getOwner() != nullptr )
91+
TheWindowManager->winSendSystemMsg( instData->getOwner(),
92+
GBM_MOUSE_ENTERING,
93+
(WindowMsgData)window,
94+
mData1 );
9495

9596
//TheWindowManager->winSetFocus( window );
9697
}
@@ -110,10 +111,11 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
110111
if(BitIsSet( instData->getStyle(), GWS_MOUSE_TRACK ) )
111112
{
112113
BitClear( instData->m_state, WIN_STATE_HILITED );
113-
TheWindowManager->winSendSystemMsg( instData->getOwner(),
114-
GBM_MOUSE_LEAVING,
115-
(WindowMsgData)window,
116-
mData1 );
114+
if( instData->getOwner() != nullptr )
115+
TheWindowManager->winSendSystemMsg( instData->getOwner(),
116+
GBM_MOUSE_LEAVING,
117+
(WindowMsgData)window,
118+
mData1 );
117119
}
118120

119121
//
@@ -137,8 +139,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
137139
case GWM_LEFT_DRAG:
138140
{
139141

140-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GGM_LEFT_DRAG,
141-
(WindowMsgData)window, mData1 );
142+
if( instData->getOwner() != nullptr )
143+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GGM_LEFT_DRAG,
144+
(WindowMsgData)window, mData1 );
142145
break;
143146

144147
}
@@ -171,8 +174,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
171174
else
172175
BitSet( instData->m_state, WIN_STATE_SELECTED );
173176

174-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
175-
(WindowMsgData)window, mData1 );
177+
if( instData->getOwner() != nullptr )
178+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
179+
(WindowMsgData)window, mData1 );
176180

177181
}
178182
else
@@ -200,8 +204,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
200204

201205
BitClear( instData->m_state, WIN_STATE_SELECTED );
202206

203-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
204-
(WindowMsgData)window, mData1 );
207+
if( instData->getOwner() != nullptr )
208+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
209+
(WindowMsgData)window, mData1 );
205210

206211
}
207212
else
@@ -248,8 +253,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
248253
else
249254
BitSet( instData->m_state, WIN_STATE_SELECTED );
250255

251-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
252-
(WindowMsgData)window, mData1 );
256+
if( instData->getOwner() != nullptr )
257+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
258+
(WindowMsgData)window, mData1 );
253259

254260
}
255261
else
@@ -284,8 +290,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
284290
BitIsSet( window->winGetStatus(), WIN_STATUS_CHECK_LIKE ) == FALSE )
285291
{
286292

287-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
288-
(WindowMsgData)window, mData1 );
293+
if( instData->getOwner() != nullptr )
294+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
295+
(WindowMsgData)window, mData1 );
289296

290297
BitClear( instData->m_state, WIN_STATE_SELECTED );
291298

@@ -330,8 +337,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
330337
BitIsSet( window->winGetStatus(), WIN_STATUS_CHECK_LIKE ) == FALSE )
331338
{
332339

333-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
334-
(WindowMsgData)window, 0 );
340+
if( instData->getOwner() != nullptr )
341+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
342+
(WindowMsgData)window, 0 );
335343

336344
BitClear( instData->m_state, WIN_STATE_SELECTED );
337345

@@ -354,8 +362,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
354362
else
355363
BitSet( instData->m_state, WIN_STATE_SELECTED );
356364

357-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
358-
(WindowMsgData)window, mData1 );
365+
if( instData->getOwner() != nullptr )
366+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
367+
(WindowMsgData)window, mData1 );
359368

360369
}
361370
else

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,11 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
9999
{
100100
BitSet( instData->m_state, WIN_STATE_HILITED );
101101

102-
TheWindowManager->winSendSystemMsg( instData->getOwner(),
103-
GBM_MOUSE_ENTERING,
104-
(WindowMsgData)window,
105-
mData1 );
102+
if( instData->getOwner() != nullptr )
103+
TheWindowManager->winSendSystemMsg( instData->getOwner(),
104+
GBM_MOUSE_ENTERING,
105+
(WindowMsgData)window,
106+
mData1 );
106107

107108
//TheWindowManager->winSetFocus( window );
108109
}
@@ -122,10 +123,11 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
122123
if(BitIsSet( instData->getStyle(), GWS_MOUSE_TRACK ) )
123124
{
124125
BitClear( instData->m_state, WIN_STATE_HILITED );
125-
TheWindowManager->winSendSystemMsg( instData->getOwner(),
126-
GBM_MOUSE_LEAVING,
127-
(WindowMsgData)window,
128-
mData1 );
126+
if( instData->getOwner() != nullptr )
127+
TheWindowManager->winSendSystemMsg( instData->getOwner(),
128+
GBM_MOUSE_LEAVING,
129+
(WindowMsgData)window,
130+
mData1 );
129131
}
130132

131133
//
@@ -149,8 +151,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
149151
case GWM_LEFT_DRAG:
150152
{
151153

152-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GGM_LEFT_DRAG,
153-
(WindowMsgData)window, mData1 );
154+
if( instData->getOwner() != nullptr )
155+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GGM_LEFT_DRAG,
156+
(WindowMsgData)window, mData1 );
154157
break;
155158

156159
}
@@ -194,8 +197,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
194197
}
195198

196199
if (buttonTriggersOnMouseDown(window)) {
197-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
198-
(WindowMsgData)window, mData1 );
200+
if( instData->getOwner() != nullptr )
201+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
202+
(WindowMsgData)window, mData1 );
199203
}
200204

201205
break;
@@ -217,8 +221,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
217221

218222
if (!buttonTriggersOnMouseDown(window)) {
219223
// If it didn't trigger on mouse down, trigger on the mouse up. jba [8/6/2003]
220-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
221-
(WindowMsgData)window, mData1 );
224+
if( instData->getOwner() != nullptr )
225+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
226+
(WindowMsgData)window, mData1 );
222227
}
223228

224229
}
@@ -266,8 +271,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
266271
else
267272
BitSet( instData->m_state, WIN_STATE_SELECTED );
268273

269-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
270-
(WindowMsgData)window, mData1 );
274+
if( instData->getOwner() != nullptr )
275+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
276+
(WindowMsgData)window, mData1 );
271277

272278
}
273279
else
@@ -302,8 +308,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
302308
BitIsSet( window->winGetStatus(), WIN_STATUS_CHECK_LIKE ) == FALSE )
303309
{
304310

305-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
306-
(WindowMsgData)window, mData1 );
311+
if( instData->getOwner() != nullptr )
312+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED_RIGHT,
313+
(WindowMsgData)window, mData1 );
307314

308315
BitClear( instData->m_state, WIN_STATE_SELECTED );
309316

@@ -348,8 +355,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
348355
BitIsSet( window->winGetStatus(), WIN_STATUS_CHECK_LIKE ) == FALSE )
349356
{
350357

351-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
352-
(WindowMsgData)window, 0 );
358+
if( instData->getOwner() != nullptr )
359+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
360+
(WindowMsgData)window, 0 );
353361

354362
BitClear( instData->m_state, WIN_STATE_SELECTED );
355363

@@ -372,8 +380,9 @@ WindowMsgHandledType GadgetPushButtonInput( GameWindow *window,
372380
else
373381
BitSet( instData->m_state, WIN_STATE_SELECTED );
374382

375-
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
376-
(WindowMsgData)window, mData1 );
383+
if( instData->getOwner() != nullptr )
384+
TheWindowManager->winSendSystemMsg( instData->getOwner(), GBM_SELECTED,
385+
(WindowMsgData)window, mData1 );
377386

378387
}
379388
else

0 commit comments

Comments
 (0)