THRIFT-4208 C# NamedPipesServer not really working in some scenarios Client: C# 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/5608e43e Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/5608e43e Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/5608e43e Branch: refs/heads/master Commit: 5608e43ec8c1fb77460c7ab3b27bbda251d29be9 Parents: 888b577 Author: Jens Geyer <[email protected]> Authored: Wed May 24 15:27:02 2017 +0200 Committer: Jens Geyer <[email protected]> Committed: Sat May 27 11:26:20 2017 +0200 ---------------------------------------------------------------------- .../src/Transport/TNamedPipeServerTransport.cs | 23 ++++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/5608e43e/lib/csharp/src/Transport/TNamedPipeServerTransport.cs ---------------------------------------------------------------------- diff --git a/lib/csharp/src/Transport/TNamedPipeServerTransport.cs b/lib/csharp/src/Transport/TNamedPipeServerTransport.cs index c1e8400..240f0df 100644 --- a/lib/csharp/src/Transport/TNamedPipeServerTransport.cs +++ b/lib/csharp/src/Transport/TNamedPipeServerTransport.cs @@ -22,9 +22,9 @@ */ using System; -using System.Collections.Generic; using System.IO.Pipes; using System.Threading; +using System.Security.Principal; namespace Thrift.Transport { @@ -68,23 +68,32 @@ namespace Thrift.Transport if (stream == null) { var direction = PipeDirection.InOut; - var maxconn = 254; + var maxconn = NamedPipeServerStream.MaxAllowedServerInstances; var mode = PipeTransmissionMode.Byte; var options = asyncMode ? PipeOptions.Asynchronous : PipeOptions.None; - var inbuf = 4096; - var outbuf = 4096; - // TODO: security + const int INBUF_SIZE = 4096; + const int OUTBUF_SIZE = 4096; + + // security + var security = new PipeSecurity(); + security.AddAccessRule( + new PipeAccessRule( + new SecurityIdentifier(WellKnownSidType.WorldSid, null), + PipeAccessRights.Read | PipeAccessRights.Write | PipeAccessRights.Synchronize | PipeAccessRights.CreateNewInstance, + System.Security.AccessControl.AccessControlType.Allow + ) + ); try { - stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, inbuf, outbuf); + stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, INBUF_SIZE, OUTBUF_SIZE, security); } catch (NotImplementedException) // Mono still does not support async, fallback to sync { if (asyncMode) { options &= (~PipeOptions.Asynchronous); - stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, inbuf, outbuf); + stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, INBUF_SIZE, OUTBUF_SIZE, security); asyncMode = false; } else
