summaryrefslogtreecommitdiff
path: root/packages/winunits-base
diff options
context:
space:
mode:
authorpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-19 07:16:37 +0000
committerpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-19 07:16:37 +0000
commit456dadd8d1a370e806d0b1cbd0ee421b044f6eab (patch)
tree149b54c9db6e0079dd4038676191c0945c4645c6 /packages/winunits-base
parent78660bc1a4e6bdffecfaa1f32c6acc7414f4dace (diff)
downloadfpc-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.pp97
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);