Use wxCHECKs to protect non-position TOOL_EVENTS
Getting the position of a non-position TOOL_EVENT will
now result in a wxCHECK, and a null-position (0,0) will
be returned. The new interface HasPosition() can be used
to determine if a call to a position function is safe to
make from the caller.
Fixes the underlying danger behind lp:1796045, which has
already been neutralised by a4966adb6
, which avoids calling
the Position() functions when the TOOL_EVENT is not known
to be a position.
Fixes: lp:1796045
* https://bugs.launchpad.net/kicad/+bug/1796045
This commit is contained in:
parent
dbc9130da9
commit
b64c6dbf35
|
@ -30,10 +30,16 @@
|
|||
#include <iterator>
|
||||
|
||||
#include <math/vector2d.h>
|
||||
#include <cassert>
|
||||
|
||||
#include <core/optional.h>
|
||||
|
||||
#ifdef WX_COMPATIBILITY
|
||||
#include <wx/debug.h>
|
||||
#else
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
|
||||
class TOOL_ACTION;
|
||||
class TOOL_MANAGER;
|
||||
|
||||
|
@ -236,26 +242,29 @@ public:
|
|||
return m_actions;
|
||||
}
|
||||
|
||||
///> Returns if it this event has a valid position (true for mouse events)
|
||||
bool HasPosition() const
|
||||
{
|
||||
return m_category == TC_MOUSE;
|
||||
}
|
||||
|
||||
///> Returns information about difference between current mouse cursor position and the place
|
||||
///> where dragging has started.
|
||||
const VECTOR2D& Delta() const
|
||||
const VECTOR2D Delta() const
|
||||
{
|
||||
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
|
||||
return m_mouseDelta;
|
||||
return returnCheckedPosition( m_mouseDelta );
|
||||
}
|
||||
|
||||
///> Returns mouse cursor position in world coordinates.
|
||||
const VECTOR2D& Position() const
|
||||
const VECTOR2D Position() const
|
||||
{
|
||||
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
|
||||
return m_mousePos;
|
||||
return returnCheckedPosition( m_mousePos );
|
||||
}
|
||||
|
||||
///> Returns the point where dragging has started.
|
||||
const VECTOR2D& DragOrigin() const
|
||||
const VECTOR2D DragOrigin() const
|
||||
{
|
||||
assert( m_category == TC_MOUSE ); // this should be used only with mouse events
|
||||
return m_mouseDragOrigin;
|
||||
return returnCheckedPosition( m_mouseDragOrigin );
|
||||
}
|
||||
|
||||
///> Returns information about mouse buttons state.
|
||||
|
@ -432,6 +441,27 @@ private:
|
|||
m_modifiers = aMods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the event is a type that has a position before returning a
|
||||
* position, otherwise return a mull-constructed position.
|
||||
* Used to defend the position accessors from runtime access when the event
|
||||
* does not have a valid position.
|
||||
*
|
||||
* @param aPos the position to return if the event is valid
|
||||
* @return the checked position
|
||||
*/
|
||||
VECTOR2D returnCheckedPosition( const VECTOR2D& aPos ) const
|
||||
{
|
||||
#ifdef WX_COMPATIBILITY
|
||||
wxCHECK_MSG( HasPosition(), VECTOR2D(),
|
||||
"Attempted to get position from non-position event" );
|
||||
#else
|
||||
assert( HasPosition() );
|
||||
#endif
|
||||
|
||||
return aPos;
|
||||
}
|
||||
|
||||
TOOL_EVENT_CATEGORY m_category;
|
||||
TOOL_ACTIONS m_actions;
|
||||
TOOL_ACTION_SCOPE m_scope;
|
||||
|
|
Loading…
Reference in New Issue