You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2013/01/23 20:59:42 UTC
[1/2] git commit: THRIFT-1842 Memory leak with Pipes Patch: Jens Geyer
THRIFT-1842 Memory leak with Pipes
Patch: Jens Geyer
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/b64a774b
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/b64a774b
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/b64a774b
Branch: refs/heads/master
Commit: b64a774b2fbfab034c0b7fff1641a46d8123d19f
Parents: d34bea0
Author: Jens Geyer <je...@apache.org>
Authored: Wed Jan 23 20:58:47 2013 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Wed Jan 23 20:58:47 2013 +0100
----------------------------------------------------------------------
lib/delphi/src/Thrift.Serializer.pas | 1 -
lib/delphi/src/Thrift.Transport.Pipes.pas | 140 ++++++++++++-----------
lib/delphi/test/TestClient.pas | 4 +
3 files changed, 77 insertions(+), 68 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/thrift/blob/b64a774b/lib/delphi/src/Thrift.Serializer.pas
----------------------------------------------------------------------
diff --git a/lib/delphi/src/Thrift.Serializer.pas b/lib/delphi/src/Thrift.Serializer.pas
index a81cef0..dce6863 100644
--- a/lib/delphi/src/Thrift.Serializer.pas
+++ b/lib/delphi/src/Thrift.Serializer.pas
@@ -138,7 +138,6 @@ procedure TSerializer.Serialize( const input : IBase; const aStm : TStream);
// Serialize the Thrift object into a byte array. The process is simple,
// just clear the byte array output, write the object into it, and grab the
// raw bytes.
-var iBytes : Int64;
const COPY_ENTIRE_STREAM = 0;
begin
try
http://git-wip-us.apache.org/repos/asf/thrift/blob/b64a774b/lib/delphi/src/Thrift.Transport.Pipes.pas
----------------------------------------------------------------------
diff --git a/lib/delphi/src/Thrift.Transport.Pipes.pas b/lib/delphi/src/Thrift.Transport.Pipes.pas
index 76ed93b..66db240 100644
--- a/lib/delphi/src/Thrift.Transport.Pipes.pas
+++ b/lib/delphi/src/Thrift.Transport.Pipes.pas
@@ -196,8 +196,7 @@ type
protected
function AcceptImpl: ITransport; override;
-
- function CreateNamedPipe : Boolean;
+ procedure CreateNamedPipe;
// INamedServerPipe
function Handle : THandle;
@@ -599,31 +598,36 @@ begin
result := FALSE;
sd := PSECURITY_DESCRIPTOR( LocalAlloc( LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH));
- Win32Check( InitializeSecurityDescriptor( sd, SECURITY_DESCRIPTOR_REVISION));
- Win32Check( SetSecurityDescriptorDacl( sd, TRUE, nil, FALSE));
+ try
+ Win32Check( InitializeSecurityDescriptor( sd, SECURITY_DESCRIPTOR_REVISION));
+ Win32Check( SetSecurityDescriptorDacl( sd, TRUE, nil, FALSE));
- sa.nLength := sizeof( sa);
- sa.lpSecurityDescriptor := sd;
- sa.bInheritHandle := TRUE; //allow passing handle to child
+ sa.nLength := sizeof( sa);
+ sa.lpSecurityDescriptor := sd;
+ sa.bInheritHandle := TRUE; //allow passing handle to child
- if not CreatePipe( hCAR, hPipeW, @sa, FBufSize) then begin //create stdin pipe
- Console.WriteLine( 'TServerPipe CreatePipe (anon) failed, '+SysErrorMessage(GetLastError));
- Exit;
- end;
+ if not CreatePipe( hCAR, hPipeW, @sa, FBufSize) then begin //create stdin pipe
+ Console.WriteLine( 'TServerPipe CreatePipe (anon) failed, '+SysErrorMessage(GetLastError));
+ Exit;
+ end;
- if not CreatePipe( hPipe, hCAW, @sa, FBufSize) then begin //create stdout pipe
- Console.WriteLine( 'TServerPipe CreatePipe (anon) failed, '+SysErrorMessage(GetLastError));
- CloseHandle( hCAR);
- CloseHandle( hPipeW);
- Exit;
- end;
+ if not CreatePipe( hPipe, hCAW, @sa, FBufSize) then begin //create stdout pipe
+ Console.WriteLine( 'TServerPipe CreatePipe (anon) failed, '+SysErrorMessage(GetLastError));
+ CloseHandle( hCAR);
+ CloseHandle( hPipeW);
+ Exit;
+ end;
- FClientAnonRead := hCAR;
- FClientAnonWrite := hCAW;
- FReadHandle := hPipe;
- FWriteHandle := hPipeW;
+ FClientAnonRead := hCAR;
+ FClientAnonWrite := hCAW;
+ FReadHandle := hPipe;
+ FWriteHandle := hPipeW;
- result := TRUE;
+ result := TRUE;
+
+ finally
+ if sd <> nil then LocalFree( Cardinal(sd));
+ end;
end;
@@ -647,9 +651,7 @@ end;
function TNamedServerPipeImpl.AcceptImpl: ITransport;
var connectRet : Boolean;
begin
- if not CreateNamedPipe()
- then raise TTransportException.Create( TTransportException.TExceptionType.NotOpen,
- 'TServerPipe CreateNamedPipe failed');
+ CreateNamedPipe;
// Wait for the client to connect; if it succeeds, the
// function returns a nonzero value. If the function returns
@@ -686,7 +688,7 @@ begin
end;
-function TNamedServerPipeImpl.CreateNamedPipe : Boolean;
+procedure TNamedServerPipeImpl.CreateNamedPipe;
var SIDAuthWorld : SID_IDENTIFIER_AUTHORITY ;
everyone_sid : PSID;
ea : EXPLICIT_ACCESS;
@@ -698,50 +700,54 @@ const
SECURITY_WORLD_SID_AUTHORITY : TSIDIdentifierAuthority = (Value : (0,0,0,0,0,1));
SECURITY_WORLD_RID = $00000000;
begin
- // Windows - set security to allow non-elevated apps
- // to access pipes created by elevated apps.
- SIDAuthWorld := SECURITY_WORLD_SID_AUTHORITY;
+ sd := nil;
everyone_sid := nil;
- AllocateAndInitializeSid( SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, everyone_sid);
-
- ZeroMemory( @ea, SizeOf(ea));
- ea.grfAccessPermissions := SPECIFIC_RIGHTS_ALL or STANDARD_RIGHTS_ALL;
- ea.grfAccessMode := SET_ACCESS;
- ea.grfInheritance := NO_INHERITANCE;
- ea.Trustee.TrusteeForm := TRUSTEE_IS_SID;
- ea.Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
- ea.Trustee.ptstrName := PChar(everyone_sid);
-
- acl := nil;
- SetEntriesInAcl( 1, @ea, nil, acl);
+ try
+ // Windows - set security to allow non-elevated apps
+ // to access pipes created by elevated apps.
+ SIDAuthWorld := SECURITY_WORLD_SID_AUTHORITY;
+ AllocateAndInitializeSid( SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, everyone_sid);
+
+ ZeroMemory( @ea, SizeOf(ea));
+ ea.grfAccessPermissions := GENERIC_ALL; //SPECIFIC_RIGHTS_ALL or STANDARD_RIGHTS_ALL;
+ ea.grfAccessMode := SET_ACCESS;
+ ea.grfInheritance := NO_INHERITANCE;
+ ea.Trustee.TrusteeForm := TRUSTEE_IS_SID;
+ ea.Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
+ ea.Trustee.ptstrName := PChar(everyone_sid);
+
+ acl := nil;
+ SetEntriesInAcl( 1, @ea, nil, acl);
+
+ sd := PSECURITY_DESCRIPTOR( LocalAlloc( LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH));
+ Win32Check( InitializeSecurityDescriptor( sd, SECURITY_DESCRIPTOR_REVISION));
+ Win32Check( SetSecurityDescriptorDacl( sd, TRUE, acl, FALSE));
+
+ sa.nLength := SizeOf(sa);
+ sa.lpSecurityDescriptor := sd;
+ sa.bInheritHandle := FALSE;
+
+ // Create an instance of the named pipe
+ hPipe := Windows.CreateNamedPipe( PChar( FPipeName), // pipe name
+ PIPE_ACCESS_DUPLEX, // read/write access
+ PIPE_TYPE_MESSAGE or // message type pipe
+ PIPE_READMODE_MESSAGE, // message-read mode
+ FMaxConns, // max. instances
+ FBufSize, // output buffer size
+ FBufSize, // input buffer size
+ 0, // client time-out
+ @sa); // default security attribute
+
+ FHandle := hPipe;
+ if( FHandle = INVALID_HANDLE_VALUE)
+ then raise TTransportException.Create( TTransportException.TExceptionType.NotOpen,
+ 'CreateNamedPipe() failed ' + IntToStr(GetLastError));
- sd := PSECURITY_DESCRIPTOR( LocalAlloc( LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH));
- Win32Check( InitializeSecurityDescriptor( sd, SECURITY_DESCRIPTOR_REVISION));
- Win32Check( SetSecurityDescriptorDacl( sd, TRUE, acl, FALSE));
-
- sa.nLength := SizeOf(sa);
- sa.lpSecurityDescriptor := sd;
- sa.bInheritHandle := FALSE;
-
- // Create an instance of the named pipe
- hPipe := Windows.CreateNamedPipe( PChar( FPipeName), // pipe name
- PIPE_ACCESS_DUPLEX, // read/write access
- PIPE_TYPE_MESSAGE or // message type pipe
- PIPE_READMODE_MESSAGE, // message-read mode
- FMaxConns, // max. instances
- FBufSize, // output buffer size
- FBufSize, // input buffer size
- 0, // client time-out
- @sa); // default security attribute
-
- if( hPipe = INVALID_HANDLE_VALUE) then begin
- FHandle := INVALID_HANDLE_VALUE;
- raise TTransportException.Create( TTransportException.TExceptionType.NotOpen,
- 'CreateNamedPipe() failed ' + IntToStr(GetLastError));
+ finally
+ if sd <> nil then LocalFree( Cardinal( sd));
+ if acl <> nil then LocalFree( Cardinal( acl));
+ if everyone_sid <> nil then FreeSid(everyone_sid);
end;
-
- FHandle := hPipe;
- result := TRUE;
end;
http://git-wip-us.apache.org/repos/asf/thrift/blob/b64a774b/lib/delphi/test/TestClient.pas
----------------------------------------------------------------------
diff --git a/lib/delphi/test/TestClient.pas b/lib/delphi/test/TestClient.pas
index baeaaa8..e72775e 100644
--- a/lib/delphi/test/TestClient.pas
+++ b/lib/delphi/test/TestClient.pas
@@ -176,6 +176,10 @@ begin
end
else if (args[i] = '-anon') then // -anon <hReadPipe> <hWritePipe>
begin
+ if Length(args) <= (i+2) then begin
+ Console.WriteLine('Invalid args: -anon <hRead> <hWrite> or use "server.exe -anon"');
+ Halt(1);
+ end;
Console.WriteLine('Anonymous pipes transport');
Inc( i);
hAnonRead := THandle( StrToIntDef( args[i], Integer(INVALID_HANDLE_VALUE)));