Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

MagickImage.ReadAsync swallows non cancellation related exceptions from the stream it reads from

Cerrado Apto para principiantes
#2,097 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp
Área
backend

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

Screenshot 2026-10-01 at 16.48.56.png

Lenguaje dominante
C#
Estrellas
4k
Forks
454
Merge medio
12 h 54 min
PR fusionados (30 d)
3

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de dlemstra/Magick.NET

Todos los issues de dlemstra/Magick.NET

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.