Explorar o código

rtl: fix SetPropValue/GetPropValue:
- raise a ERangeError in SetPropValue when passed value is out of property range
- handle QWord values both in SetPropValue and GetPropValue

git-svn-id: trunk@14500 -

paul %!s(int64=15) %!d(string=hai) anos
pai
achega
c025471433
Modificáronse 1 ficheiros con 51 adicións e 14 borrados
  1. 51 14
      rtl/inc/variants.pp

+ 51 - 14
rtl/inc/variants.pp

@@ -4296,6 +4296,8 @@ begin
        Result := GetVariantProp(Instance, PropInfo);
      tkInt64:
        Result := GetInt64Prop(Instance, PropInfo);
+     tkQWord:
+       Result := QWord(GetInt64Prop(Instance, PropInfo));
    else
      raise EPropertyConvertError.CreateFmt('Invalid Property Type: %s',[PropInfo^.PropType^.Name]);
    end;
@@ -4306,10 +4308,12 @@ Procedure SetPropValue(Instance: TObject; const PropName: string;  const Value:
 
 var
  PropInfo: PPropInfo;
-// TypeData: PTypeData;
- O : Integer;
- S : String;
- B : Boolean;
+ TypeData: PTypeData;
+ O: Integer;
+ I64: Int64;
+ Qw: QWord;
+ S: String;
+ B: Boolean;
 
 begin
    // find the property
@@ -4318,36 +4322,57 @@ begin
      raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName])
    else
      begin
-//     TypeData := GetTypeData(PropInfo^.PropType);
+     TypeData := GetTypeData(PropInfo^.PropType);
      // call Right SetxxxProp
      case PropInfo^.PropType^.Kind of
        tkBool:
          begin
          { to support the strings 'true' and 'false' }
-         B:=Value;
-         SetOrdProp(Instance, PropInfo, ord(B));
+         if (VarType(Value)=varOleStr) or
+            (VarType(Value)=varString) or
+            (VarType(Value)=varBoolean) then
+           begin
+             B:=Value;
+             SetOrdProp(Instance, PropInfo, ord(B));
+           end
+         else
+           begin
+             I64:=Value;
+             if (I64<TypeData^.MinValue) or (I64>TypeData^.MaxValue) then
+               raise ERangeError.Create(SRangeError);
+             SetOrdProp(Instance, PropInfo, I64);
+           end;
          end;
        tkInteger, tkChar, tkWChar:
          begin
-         O:=Value;
-         SetOrdProp(Instance, PropInfo, O);
+         I64:=Value;
+         if (TypeData^.OrdType=otULong) then
+           if (I64<LongWord(TypeData^.MinValue)) or (I64>LongWord(TypeData^.MaxValue)) then
+             raise ERangeError.Create(SRangeError)
+           else
+         else
+         if (I64<TypeData^.MinValue) or (I64>TypeData^.MaxValue) then
+           raise ERangeError.Create(SRangeError);
+         SetOrdProp(Instance, PropInfo, I64);
          end;
        tkEnumeration :
          begin
-         if (VarType(Value)=varOleStr) or  (VarType(Value)=varString) then
+         if (VarType(Value)=varOleStr) or (VarType(Value)=varString) then
            begin
            S:=Value;
            SetEnumProp(Instance,PropInfo,S);
            end
          else
            begin
-           O:=Value;
-           SetOrdProp(Instance, PropInfo, O);
+           I64:=Value;
+           if (I64<TypeData^.MinValue) or (I64>TypeData^.MaxValue) then
+             raise ERangeError.Create(SRangeError);
+           SetOrdProp(Instance, PropInfo, I64);
            end;
          end;
        tkSet :
          begin
-         if (VarType(Value)=varOleStr) or  (VarType(Value)=varString) then
+         if (VarType(Value)=varOleStr) or (VarType(Value)=varString) then
            begin
            S:=Value;
            SetSetProp(Instance,PropInfo,S);
@@ -4371,7 +4396,19 @@ begin
        tkVariant:
          SetVariantProp(Instance, PropInfo, Value);
        tkInt64:
-         SetInt64Prop(Instance, PropInfo, Value);
+         begin
+           I64:=Value;
+           if (I64<TypeData^.MinInt64Value) or (I64>TypeData^.MaxInt64Value) then
+             raise ERangeError.Create(SRangeError);
+           SetInt64Prop(Instance, PropInfo, I64);
+         end;
+       tkQWord:
+         begin
+           Qw:=Value;
+           if (Qw<TypeData^.MinQWordValue) or (Qw>TypeData^.MaxQWordValue) then
+             raise ERangeError.Create(SRangeError);
+           SetInt64Prop(Instance, PropInfo,Qw);
+         end
      else
        raise EPropertyConvertError.CreateFmt('SetPropValue: Invalid Property Type %s',
                                       [PropInfo^.PropType^.Name]);