PropertyContainer: fix false hit when searching property

PropertyContainer uses a static member of type PropertyData to register
static properties. PropertyData uses a short variable to record the
offset of the property against its container.

Because of possible 'short' truncation, when searching of property that
in fact is from another container, we must check if the pointer within
boundary. Otherwise, truncation will result in effectively random
number, and possibly causing a false hit.
This commit is contained in:
Zheng, Lei
2018-03-24 11:33:28 +08:00
committed by wmayer
parent 03af975134
commit ba3fb75b48
2 changed files with 9 additions and 1 deletions

View File

@@ -321,6 +321,7 @@ void PropertyData::addProperty(OffsetBase offsetBase,const char* PropName, Prope
PropertySpec temp;
temp.Name = PropName;
temp.Offset = offsetBase.getOffsetTo(Prop);
assert(temp.Offset>=0);
temp.Group = PropertyGroup;
temp.Type = Type;
temp.Docu = PropertyDocu;
@@ -343,6 +344,8 @@ const PropertyData::PropertySpec *PropertyData::findProperty(OffsetBase offsetBa
const PropertyData::PropertySpec *PropertyData::findProperty(OffsetBase offsetBase,const Property* prop) const
{
const int diff = offsetBase.getOffsetTo(prop);
if(diff<0)
return 0;
for (vector<PropertyData::PropertySpec>::const_iterator It = propertyData.begin(); It != propertyData.end(); ++It)
if(diff == It->Offset)

View File

@@ -25,6 +25,7 @@
#define APP_PROPERTYCONTAINER_H
#include <map>
#include <climits>
#include <Base/Persistence.h>
namespace Base {
@@ -69,7 +70,11 @@ struct AppExport PropertyData
OffsetBase(const App::Extension* container) : m_container(container) {};
short int getOffsetTo(const App::Property* prop) const {
return (short) ((char*)prop - (char*)m_container);
auto *pt = (const char*)prop;
auto *base = (const char *)m_container;
if(pt<base || pt>base+SHRT_MAX)
return -1;
return (short) (pt-base);
};
char* getOffset() const {return (char*) m_container;};