[Mono-dev] TcpListener.AcceptTcpClient leaks a socket at each call
"Andrés G. Aragoneses"
knocte at gmail.com
Thu Jan 23 17:34:23 UTC 2014
Sounds good, then can the SetTcpClient() method be removed?
(If it can't because other places in the code are using it, you would
need to:
- Either make them use the new ctor.
- Or fix SetTcpClient() to close the previous socket?
)
If it can be removed because there are no more things using it, I say
simply create a pull request with your change.
On 23/01/14 16:59, Jonathan Gagnon wrote:
> Here is the proposed change. See attached files.
>
> I'm not too familiar with sending diffs so let me know if I didn't send
> it in the expected format.
>
> *Jonathan Gagnon*
> Architecte d'application / Application Architect
> 600, boulevard Armand-Frappier, bureau 200
> Laval (Québec) H7V 4B4
> Canada
> T : 450-662-6101 poste 234
> <http://www.croesus.com>
> <http://www.facebook.com/pages/Croesus-Finansoft/345020305606240><http://www.linkedin.com/company/croesus-finansoft?trk=hb_tab_compy_id_26141><https://twitter.com/CroesusFin>
>
>
>
> On Wed, Jan 22, 2014 at 5:15 PM, "Andrés G. Aragoneses"
> <knocte at gmail.com <mailto:knocte at gmail.com>> wrote:
>
> On 22/01/14 22:32, Jonathan Gagnon wrote:
> > I found a leak in TcpListener.AcceptTcpClient :
> >
> > public TcpClient AcceptTcpClient ()
> > {
> > if (!active)
> > throw new InvalidOperationException ("Socket is not listening");
> >
> > Socket clientSocket = server.Accept ();
> >
> > TcpClient client = new TcpClient(); // this call creates a socket
> even
> > though we don't need it
> > // use internal method SetTcpClient to make a
> > // client with the specified socket
> > client.SetTcpClient (clientSocket); // This method leaks the socket
> > created by the default constructor.
> >
> > return client;
> > }
> >
> >
> > The method calls the default TcpClient constructor which creates a new
> > socket. SetTcpClient is then called to assign the accepted socket to
> > the TcpClient object. The problem is that the SetTcpClient simply
> > replaces the old socket reference by the new without closing the old
> > socket. The result is that the socket created by the default
> > constructor remains until the GC reclaims it.
> >
> > The fix would be really easy. Instead of calling the default
> TcpClient
> > constructor, a new constructor could be created taking the socket as
> > parameter. We would then avoid creating and leaking a socket
> every time
> > the method is called. The fixed method would look like this :
> >
> > public TcpClient AcceptTcpClient ()
> > {
> > if (!active)
> > throw new InvalidOperationException ("Socket is not listening");
> >
> > Socket clientSocket = server.Accept ();
> >
> > TcpClient client = new TcpClient(clientSocket);
> >
> > return client;
> > }
> >
> >
> > I could create a fix with the proposed solution. Any thoughts?
>
> Propose your solution as diff format please, it's much easier to
> understand and review.
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> <mailto:Mono-devel-list at lists.ximian.com>
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
More information about the Mono-devel-list
mailing list