diff options
| author | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-01-19 07:16:37 +0000 |
|---|---|---|
| committer | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-01-19 07:16:37 +0000 |
| commit | 456dadd8d1a370e806d0b1cbd0ee421b044f6eab (patch) | |
| tree | 149b54c9db6e0079dd4038676191c0945c4645c6 /packages/winunits-base | |
| parent | 78660bc1a4e6bdffecfaa1f32c6acc7414f4dace (diff) | |
| download | fpc-456dadd8d1a370e806d0b1cbd0ee421b044f6eab.tar.gz | |
comobj: for loop to ArgCount - 1 causes a crash when ArgCount = 0 because it is unsigned
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@14743 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/winunits-base')
| -rw-r--r-- | packages/winunits-base/src/comobj.pp | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/packages/winunits-base/src/comobj.pp b/packages/winunits-base/src/comobj.pp index 52c99b4dfb..ef79e47938 100644 --- a/packages/winunits-base/src/comobj.pp +++ b/packages/winunits-base/src/comobj.pp @@ -1346,59 +1346,60 @@ HKCR GetMem(Arguments,desc^.calldesc.argcount*sizeof(TVarData)); { prepare parameters } - for i:=0 to desc^.CallDesc.ArgCount-1 do - begin -{$ifdef DEBUG_DISPATCH} - writeln('DoDispCallByID: Params = ',hexstr(PtrInt(Params),SizeOf(Pointer)*2)); -{$endif DEBUG_DISPATCH} - { get plain type } - CurrType:=desc^.CallDesc.ArgTypes[i] and $3f; - { by reference? } - if (desc^.CallDesc.ArgTypes[i] and $80)<>0 then - begin -{$ifdef DEBUG_DISPATCH} - write('DispatchInvoke: Got ref argument with type = ',CurrType); - writeln; -{$endif DEBUG_DISPATCH} - Arguments[i].VType:=CurrType or VarByRef; - Arguments[i].VPointer:=PPointer(Params)^; - inc(PPointer(Params)); - end - else - begin -{$ifdef DEBUG_DISPATCH} - writeln('DispatchInvoke: Got ref argument with type = ',CurrType); -{$endif DEBUG_DISPATCH} - case CurrType of - varVariant: - begin - Arguments[i].VType:=CurrType; - move(PVarData(Params)^,Arguments[i],sizeof(TVarData)); - inc(PVarData(Params)); - end; - varCurrency, - varDouble, - VarDate: + if desc^.CallDesc.ArgCount > 0 then + for i:=0 to desc^.CallDesc.ArgCount-1 do + begin + {$ifdef DEBUG_DISPATCH} + writeln('DoDispCallByID: Params = ',hexstr(PtrInt(Params),SizeOf(Pointer)*2)); + {$endif DEBUG_DISPATCH} + { get plain type } + CurrType:=desc^.CallDesc.ArgTypes[i] and $3f; + { by reference? } + if (desc^.CallDesc.ArgTypes[i] and $80)<>0 then + begin + {$ifdef DEBUG_DISPATCH} + write('DispatchInvoke: Got ref argument with type = ',CurrType); + writeln; + {$endif DEBUG_DISPATCH} + Arguments[i].VType:=CurrType or VarByRef; + Arguments[i].VPointer:=PPointer(Params)^; + inc(PPointer(Params)); + end + else + begin + {$ifdef DEBUG_DISPATCH} + writeln('DispatchInvoke: Got ref argument with type = ',CurrType); + {$endif DEBUG_DISPATCH} + case CurrType of + varVariant: + begin + Arguments[i].VType:=CurrType; + move(PVarData(Params)^,Arguments[i],sizeof(TVarData)); + inc(PVarData(Params)); + end; + varCurrency, + varDouble, + VarDate: + begin + {$ifdef DEBUG_DISPATCH} + writeln('DispatchInvoke: Got 8 byte float argument'); + {$endif DEBUG_DISPATCH} + Arguments[i].VType:=CurrType; + move(PPointer(Params)^,Arguments[i].VDouble,sizeof(Double)); + inc(PDouble(Params)); + end; + else begin -{$ifdef DEBUG_DISPATCH} - writeln('DispatchInvoke: Got 8 byte float argument'); -{$endif DEBUG_DISPATCH} + {$ifdef DEBUG_DISPATCH} + writeln('DispatchInvoke: Got argument with type ',CurrType); + {$endif DEBUG_DISPATCH} Arguments[i].VType:=CurrType; - move(PPointer(Params)^,Arguments[i].VDouble,sizeof(Double)); - inc(PDouble(Params)); + Arguments[i].VPointer:=PPointer(Params)^; + inc(PPointer(Params)); end; - else - begin -{$ifdef DEBUG_DISPATCH} - writeln('DispatchInvoke: Got argument with type ',CurrType); -{$endif DEBUG_DISPATCH} - Arguments[i].VType:=CurrType; - Arguments[i].VPointer:=PPointer(Params)^; - inc(PPointer(Params)); - end; + end; end; end; - end; dispparams.cArgs:=desc^.calldesc.argcount; dispparams.rgvarg:=pointer(Arguments); |
