开发者

RangeCheckError in JEDI WSCL

I'm using JEDI WSCL to change permissions on a folder during installation. When co开发者_Go百科mpiling without Optimization, and with Range Checking, I get a rangecheck when setting the new Access Control List.

procedure SetFilePermissions(const folder: string);
var
  FileObject: TJwSecureFileObject;
  DACL: TJwDAccessControlList;
begin
  FileObject := TJwSecureFileObject.Create(folder);
  try
     DACL := FileObject.DACL;
     JwInitWellknownSIDs;
     DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce],   GENERIC_ALL, JwWorldSID, false));
     FileObject.SetDACL(DACL);
  finally
    FileObject.Free;
  end;
end;

It lookes like it comes from function TJwSecurityId.CreateCopyOfSID( ) in JwsclSid.pas, but I can not find out why.

Do anybody have any clue?

I'm using Delphi 2007, btw, and the wscl code is the latest from sourceforge.

regards,

-Vegar


The reason is the declaration of the PSID structure. It has a memeber called SubAuthority that is defined as follow:

SubAuthority: array [0..ANYSIZE_ARRAY - 1] of DWORD;

ANYSIZE_ARRAY is a constant that is set to 1 and thus the range of the array is 0 to 0. This is a c construct converted to Delphi but Delphi doesn't know it. The structure is created safely by allocating enough space to allow more than just one DWORD in the array.

This exception happens quite often if you are using variable c structures in Delphi with activated range check error.

However, as a solution you can turn off the switch for JWSCL by opening the jwscl.inc file and add {$R-}. AFAIK the switch lasts only to the end of each unit and then the default value is used. The inc file is included in every single jwscl file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜