summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-06-21 08:30:27 +0000
committeryury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-06-21 08:30:27 +0000
commitd16c7fbbd6ed439a55b08d026e3d774ced3b858c (patch)
treeb80cdd0eefa3d160504b47a49e7e64cd817a27c0
parent3a3c44005e29324d9461a5d3c0ca90bd970f3092 (diff)
downloadfpc-d16c7fbbd6ed439a55b08d026e3d774ced3b858c.tar.gz
* 2.2 only fix: dont crash when copying empty vararray.
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/fixes_2_2@7753 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/inc/variants.pp9
1 files changed, 6 insertions, 3 deletions
diff --git a/rtl/inc/variants.pp b/rtl/inc/variants.pp
index 9040505b2d..26279e8d52 100644
--- a/rtl/inc/variants.pp
+++ b/rtl/inc/variants.pp
@@ -1664,7 +1664,7 @@ procedure sysvarcopyproc(var d : tvardata;const s : tvardata);
ubound : longint;
iter : tvariantarrayiter;
varfrom,varto : pvardata;
- i : SizeInt;
+ i, cnt : SizeInt;
begin
if @d=@s then
exit;
@@ -1697,17 +1697,20 @@ procedure sysvarcopyproc(var d : tvardata;const s : tvardata);
getmem(boundsarray,p^.DimCount*sizeof(TVarArrayBound));
try
+ cnt:=0;
for i:=0 to p^.DimCount-1 do
begin
VarResultCheck(SafeArrayGetLBound(p,i+1,boundsarray^[i].lowbound));
VarResultCheck(SafeArrayGetUBound(p,i+1,ubound));
boundsarray^[i].elementcount:=ubound-boundsarray^[i].lowbound+1;
+ Inc(cnt, boundsarray^[i].elementcount);
end;
newarray:=SafeArrayCreate(varVariant,p^.DimCount,boundsarray^);
if not(assigned(newarray)) then
VarArrayCreateError;
+ if cnt > 0 then
try
iter.init(p^.DimCount,boundsarray);
repeat
@@ -1715,11 +1718,11 @@ procedure sysvarcopyproc(var d : tvardata;const s : tvardata);
VarResultCheck(SafeArrayPtrOfIndex(newarray,iter.coords,varto));
sysvarcopyproc(varto^,varfrom^);
until not(iter.next);
- d.vtype:=varVariant or varArray;
- d.varray:=newarray;
finally
iter.done;
end;
+ d.vtype:=varVariant or varArray;
+ d.varray:=newarray;
finally
freemem(boundsarray);
end;