Exception during ExecuteAsync throws Exception that cannot be handled
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 68/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- csharp
- Ambito
- networking
Direzione di ricerca
Inizia da SshCommand.ExecuteAsync e traccia la sequenza di avvio dalla creazione di _tcs, passando per _channel.Open() e SendExecRequest(...); quindi esamina come Dispose() gestisce un'attività incompleta. Verifica il comportamento durante un'eccezione di avvio e assicurati che l'errore venga restituito o che non rimanga alcuna attività faulted nascosta.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
SshCommand.ExecuteAsync appears to have a race during command startup.
In the current implementation, _tcs is created before _channel.Open() and _channel.SendExecRequest(...) are called:
_tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
_userToken = cancellationToken;
_channel.DataReceived += Channel_DataReceived;
_channel.ExtendedDataReceived += Channel_ExtendedDataReceived;
_channel.RequestReceived += Channel_RequestReceived;
_channel.Closed += Channel_Closed;
_channel.Open();
_ = _channel.SendExecRequest(CommandText);
return _tcs.Task;
If _channel.Open() or _channel.SendExecRequest(...) throws synchronously due to a connection/session teardown, the method exits before returning _tcs.Task.
If the caller uses the command in a using block, disposal may then execute while _tcs.Task is still incomplete:
if (_tcs is { Task.IsCompleted: false } tcs)
{
_ = tcs.TrySetException(new ObjectDisposedException(GetType().FullName));
}
This can produce a faulted task that was never returned to the caller and therefore can never be awaited or observed. Later, that can surface via TaskScheduler.UnobservedTaskException.
Expected behavior
If command startup fails after _tcs has been created, the failure should not leave behind an orphaned faulted task.
Possible acceptable outcomes:
- ExecuteAsync returns a faulted task, or
- ExecuteAsync catches startup exceptions after _tcs creation, completes _tcs accordingly, and returns it, or
- startup is arranged so no internal task exists before all synchronous failure points have passed.
Actual behavior
Under transient network/session failure, a caller can observe:
- a synchronous exception from ExecuteAsync, and later
- an unrelated TaskScheduler.UnobservedTaskException caused by the internal _tcs.Task being faulted during Dispose() without ever having been returned.
Observed trigger
In our case this happened around network loss / socket failure. We saw a preceding socket error similar to:
System.Net.Sockets.SocketException: A socket operation was attempted to an unreachable network
That seems consistent with the session being torn down while a command is being started.
Suggested fix direction
Wrap the startup section after _tcs creation in a try/catch, and ensure that any exception either:
- completes _tcs and returns _tcs.Task, or
- resets internal state so no hidden faulted task remains.
A minimal fix would likely be around the section between _tcs = new TaskCompletionSource(...) and return _tcs.Task.
- Lingua principale
- C#
- Stelle
- 4.4k
- Fork
- 993
- Merge medio
- 9g 21h
- PR unite (30g)
- 1
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di sshnet/SSH.NET
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
-
Using SshClient on Linux under Wine throws System.Security.Cryptography.CryptographicException Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 67/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
-
sshnet/SSH.NET#1795 · 1 commento · 1 reazione · 2 assegnatari ·
Tutte le issue di sshnet/SSH.NET
Issue simili
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
sillsdev/languageforge-lexbox#2665 ·
-
bug documentation frontend
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
azurenoops/spin_agent#975 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficoltà 2/5 1-3 ore Idoneità per principianti 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
SubtitleEdit/subtitleedit#15108 · 1 commento ·