|  | @@ -1,8 +1,8 @@
 | 
	
		
			
				|  |  | -using System.Threading;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using System.Globalization;
 | 
	
		
			
				|  |  | +using System.Threading;
 | 
	
		
			
				|  |  |  using Renci.SshNet.Common;
 | 
	
		
			
				|  |  |  using Renci.SshNet.Messages.Connection;
 | 
	
		
			
				|  |  | -using System.Globalization;
 | 
	
		
			
				|  |  | -using System.Collections.Generic;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -51,9 +51,7 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (!this.IsOpen)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  |                      throw new SshException(string.Format(CultureInfo.CurrentCulture, "Failed to open a channel after {0} attempts.", this._failedOpenAttempts));
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -66,7 +64,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          protected override void OnOpenConfirmation(uint remoteChannelNumber, uint initialWindowSize, uint maximumPacketSize)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              base.OnOpenConfirmation(remoteChannelNumber, initialWindowSize, maximumPacketSize);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this._channelOpenResponseWaitHandle.Set();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -79,9 +76,7 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          protected override void OnOpenFailure(uint reasonCode, string description, string language)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._failedOpenAttempts++;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SessionSemaphore.Release();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this._channelOpenResponseWaitHandle.Set();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -104,9 +99,7 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |              base.Close(wait);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (!wait)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  |                  this.SessionSemaphore.Release();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -124,11 +117,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendPseudoTerminalRequest(string environmentVariable, uint columns, uint rows, uint width, uint height, IDictionary<TerminalModes, uint> terminalModeValues)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new PseudoTerminalRequestInfo(environmentVariable, columns, rows, width, height, terminalModeValues)));
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -143,11 +133,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendX11ForwardingRequest(bool isSingleConnection, string protocol, byte[] cookie, uint screenNumber)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new X11ForwardingRequestInfo(isSingleConnection, protocol, cookie, screenNumber)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -160,11 +147,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendEnvironmentVariableRequest(string variableName, string variableValue)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new EnvironmentVariableRequestInfo(variableName, variableValue)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -175,11 +159,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendShellRequest()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new ShellRequestInfo()));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -191,11 +172,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendExecRequest(string command)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new ExecRequestInfo(command, this.ConnectionInfo.Encoding)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -207,11 +185,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendBreakRequest(uint breakLength)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new BreakRequestInfo(breakLength)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -223,11 +198,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendSubsystemRequest(string subsystem)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new SubsystemRequestInfo(subsystem)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -242,7 +214,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendWindowChangeRequest(uint columns, uint rows, uint width, uint height)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new WindowChangeRequestInfo(columns, rows, width, height)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -254,7 +225,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendLocalFlowRequest(bool clientCanDo)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new XonXoffRequestInfo(clientCanDo)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -266,7 +236,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendSignalRequest(string signalName)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new SignalRequestInfo(signalName)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -278,7 +247,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendExitStatusRequest(uint exitStatus)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new ExitStatusRequestInfo(exitStatus)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -293,7 +261,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendExitSignalRequest(string signalName, bool coreDumped, string errorMessage, string language)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new ExitSignalRequestInfo(signalName, coreDumped, errorMessage, language)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -304,11 +271,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendEndOfWriteRequest()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new EndOfWriteRequestInfo()));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -319,11 +283,8 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          public bool SendKeepAliveRequest()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channelRequestResponse.Reset();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.SendMessage(new ChannelRequestMessage(this.RemoteChannelNumber, new KeepAliveRequestInfo()));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this.WaitOnHandle(this._channelRequestResponse);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              return this._channelRequestSucces;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -334,7 +295,10 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              base.OnSuccess();
 | 
	
		
			
				|  |  |              this._channelRequestSucces = true;
 | 
	
		
			
				|  |  | -            this._channelRequestResponse.Set();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var channelRequestResponse = _channelRequestResponse;
 | 
	
		
			
				|  |  | +            if (channelRequestResponse != null)
 | 
	
		
			
				|  |  | +                channelRequestResponse.Set();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -343,8 +307,11 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |          protected override void OnFailure()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              base.OnFailure();
 | 
	
		
			
				|  |  | -            this._channelRequestSucces = false;
 | 
	
		
			
				|  |  | -            this._channelRequestResponse.Set();
 | 
	
		
			
				|  |  | +            _channelRequestSucces = false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var channelRequestResponse = _channelRequestResponse;
 | 
	
		
			
				|  |  | +            if (channelRequestResponse != null)
 | 
	
		
			
				|  |  | +                channelRequestResponse.Set();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -356,7 +323,6 @@ namespace Renci.SshNet.Channels
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  //  Ensure that channels are available
 | 
	
		
			
				|  |  |                  this.SessionSemaphore.Wait();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |                  this.SendMessage(new ChannelOpenMessage(this.LocalChannelNumber, this.LocalWindowSize, this.PacketSize, new SessionChannelOpenInfo()));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 |