Browse Source

Fixed AsyncLock::WaitAsync cancellation bug

There isn't any code in MQTTnet that actually uses a cancellation token in WaitAsync, so this is more of a preventative thing than a bug fix.  The original code just checks if the task was completed, not whether it was cancelled.  If the process is cancelled immediately before the call to WaitAsync, it'll return as normal (https://referencesource.microsoft.com/#mscorlib/system/threading/SemaphoreSlim.cs,612) rather than throw a cancellation exception.  This change will ensure we only return the releaser if the wait actually ran to completion rather than exited early due to cancellation.  I've tested this, and it properly throws a cancellation exception later on.
release/3.x.x
Paul Fake 5 years ago
committed by GitHub
parent
commit
5c40577bec
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 1 additions and 1 deletions
  1. +1
    -1
      Source/MQTTnet/Internal/AsyncLock.cs

+ 1
- 1
Source/MQTTnet/Internal/AsyncLock.cs View File

@@ -23,7 +23,7 @@ namespace MQTTnet.Internal
public Task<IDisposable> WaitAsync(CancellationToken cancellationToken) public Task<IDisposable> WaitAsync(CancellationToken cancellationToken)
{ {
var task = _semaphore.WaitAsync(cancellationToken); var task = _semaphore.WaitAsync(cancellationToken);
if (task.IsCompleted)
if (task.Status == TaskStatus.RanToCompletion)
{ {
return _releaser; return _releaser;
} }


Loading…
Cancel
Save