sshnet / sshnet/SSH.NET

SftpClient Thread leak when authentication fails

Aperta
#687 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
C#
Stelle
4.4k
Fork
993
Merge medio
9g 21h
PR unite (30g)
1

Descrizione

Using 2016.1.0

As the title says, when attempting to call Connect(), if the connection succeeds but the authentication fails, a leak happens. This can be negated by wrapping the connection in a Try/Catch and calling Disconnect if the call throws.

Here's a simple loop producing the effect (remove the Disconnect to see the increase in thread count) :

class Program
{
    static void Main(string[] args)
    {
        var testCount = 10;
        var clientInstance = new SftpClient("127.0.0.1", 22, "username", "invalidpassword");
        var process = Process.GetCurrentProcess();

        var threadCountBefore = process.Threads.Count;

        for (var i = 0; i < testCount; i++)
        {
            try
            {
                clientInstance.Connect();
            }
            catch
            {
                // Without this, there is a thread leak
                clientInstance.Disconnect();
            }
        }

        process.Refresh();
        var threadCountAfter = process.Threads.Count;
    }
}

After some research, I believe it is linked to the message listener thread in Session.cs. After starting it, if the key exchange fails, the code will gracefully exit by calling Disconnect() first. Otherwise, it goes on to authentication but allows the exceptions to break the flow and exit immediately, without calling Disconnect().

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia in Session.cs e riproduci il problema con il ciclo Connect() fornito usando credenziali non valide. Traccia il percorso del fallimento dell’autenticazione dopo l’avvio del thread del listener dei messaggi, confrontandolo con il percorso del fallimento dello scambio di chiavi. Il lavoro è completato quando tentativi ripetuti di autenticazione non riusciti non causano più perdite di thread senza richiedere un Disconnect() esplicito.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
csharp
Ambito
networking
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.