MagickImage.ReadAsync swallows non cancellation related exceptions from the stream it reads from
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
Línea de trabajo
Comienza localizando AsyncStreamWrapper.ReadAsync y la ruta de MagickImage.ReadAsync que espera a que termine. Reproduce el problema con la prueba ThrowingStream proporcionada y, después, verifica que su IOException llegue al llamador mientras la cancelación siga comportándose como estaba previsto. Se considera terminado cuando la prueba pasa sin devolver una imagen vacía.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Magick.NET version
14.17.2
Environment (Operating system, version and so on)
Mac / Linix
Description
AsyncStreamWrapper has this code:
private async Task ReadAsync(CancellationToken cancellationToken)
{
while (true)
{
try
{
await _performRead.WaitAsync(cancellationToken).ConfigureAwait(false);
}
catch
{
_exceptionThrown = true;
if (_performRead.Wait(0))
_readDone.Release();
return;
}
if (_readCount == -1)
return;
try
{
_readCount = await _stream.ReadAsync(Data, 0, _readCount, cancellationToken).ConfigureAwait(false);
}
catch
{
_exceptionThrown = true;
}
finally
{
_readDone.Release();
}
}
}
if _stream.ReadAsync throws the fact is logged so that subsequently in the caller the cancellation token has an opportunity to throw.
var readTask = ReadAsync(cancellationToken);
await Task.WhenAll(actionTask, readTask).ConfigureAwait(false);
if (_exceptionThrown)
cancellationToken.ThrowIfCancellationRequested();
}
However this has an unfortunate side effect, and that is that non-cancellation related exceptions are swallowed. I discovered this because I use a wrapper around my network streams that throw under certain conditions. When this wrapper throws MagickImage.ReadAsync returns an RGB image of 0x0 dimensions rather than allowing the exception to percolate up.
Steps to Reproduce
class ThrowingStream : MemoryStream
{
public ThrowingStream(byte[] buffer, bool writable) : base(buffer, writable)
{
}
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
throw new IOException("Space Goat Failure");
}
}
[TestMethod]
public async Task SafeReadAsync_HealthyStream_ReadsTheImageBad()
{
using var image = new MagickImage();
byte[] input = [1, 2, 3, 4, 5];
await Assert.ThrowsAsync<Exception>(() => image.ReadAsync(new ThrowingStream(input, false)));
}
The test fails because the exception is swallowed.
The screenshot is just a placeholder so I could submit the issue, it is of no relevance.
Images
- Lenguaje dominante
- C#
- Estrellas
- 4k
- Forks
- 454
- Merge medio
- 12 h 54 min
- PR fusionados (30 d)
- 3
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de dlemstra/Magick.NET
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
dlemstra/Magick.NET#2087 · 2 comentarios ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 58/100
dlemstra/Magick.NET#2100 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
dlemstra/Magick.NET#2098 ·
-
Incorrect ExifIfds for ImageHistory exif tag (or conversion issue from System.Drawing.Bitmap)Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
dlemstra/Magick.NET#2042 · 4 comentarios ·
-
GPU supportAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
dlemstra/Magick.NET#1949 · 5 comentarios ·
Todos los issues de dlemstra/Magick.NET
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 76/100
pyrevitlabs/pyRevit#3792 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 60/100
Los mantenedores suelen responder en 1 día
-
area: design documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
eyalgolan/statecraft-israel#883 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 3 días
-
area/indexing bug package/core triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día