diff options
author | yury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-06-21 08:30:27 +0000 |
---|---|---|
committer | yury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-06-21 08:30:27 +0000 |
commit | d16c7fbbd6ed439a55b08d026e3d774ced3b858c (patch) | |
tree | b80cdd0eefa3d160504b47a49e7e64cd817a27c0 | |
parent | 3a3c44005e29324d9461a5d3c0ca90bd970f3092 (diff) | |
download | fpc-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.pp | 9 |
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; |