`frombytes()` and in-place `ImageCms` transforms write into read-only image memory
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 50/100
Línea de trabajo
Start with Image.frombytes() and ImageCmsTransform.apply() in Pillow’s image and ImageCms implementations, then trace how their callers handle readonly memory. Run the reproduction snippets in the issue and inspect related mutability tests. Done means writes to read-only image buffers no longer crash or alter the source data, while plugin loading avoids extra copies and recursion.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What did you do?
Called frombytes() on an image opened from an uncompressed TIFF, which Pillow maps into memory read-only:
from PIL import Image
Image.new("RGBA", (64, 64)).save("test.tif")
with Image.open("test.tif") as im:
im.load()
im.frombytes(b"\x01" * 64 * 64 * 4)
An in-place colour transform does the same, even without load():
from PIL import Image, ImageCms
srgb = ImageCms.createProfile("sRGB")
with Image.open("test.tif") as im:
ImageCms.profileToProfile(im, srgb, srgb, inPlace=True)
And frombytes() on an image made by frombuffer() from bytes:
from PIL import Image
data = bytes(64)
im = Image.frombuffer("L", (8, 8), data, "raw", "L", 0, 1)
im.frombytes(b"\x01" * 64)
print(data[:4])
What did you expect to happen?
The same as with paste(), putpixel(), putdata() or putalpha(): the image is copied first and the copy is changed, while the file and data stay as they were.
What actually happened?
The first two crash, with a bus error on macOS and a segmentation fault on Linux. The third prints b'\x01\x01\x01\x01': the bytes object was changed. An image from Image.fromarrow() behaves the same way, the new values end up in the Arrow array.
frombytes() gives self.im to the decoder without looking at readonly, and ImageCmsTransform.apply(im, imOut), which inPlace=True uses, writes into imOut the same way. The methods above call _ensure_mutable() first.
This fixes it for me, and the test suite still passes:
# Image.frombytes(), after the zero-size check
if self.im.readonly:
self._copy()
# ImageCmsTransform.apply()
if imOut is None:
imOut = Image.new(self.output_mode, im.size)
else:
imOut._ensure_mutable()
I did not use _ensure_mutable() in frombytes() because plugins call frombytes() from their own load(), while ImageFile.readonly is still 1. Every GbrImagePlugin and WalImageFile image would be copied once more, and a plugin that marks itself loaded only after frombytes() (pillow-heif 1.8.1, for example) ends in RecursionError.
We ran into this while moving pillow-heif to Image.fromarrow() (https://github.com/bigcat88/pillow_heif/pull/463, after #9896).
What are your OS, Python and Pillow versions?
- OS: macOS 26.5 arm64, Linux aarch64 (Docker
python:3.11-slim) - Python: 3.11
- Pillow: 12.3.0, 13.0.0 and
main(6085656)
- Lenguaje dominante
- Python
- Estrellas
- 13.9k
- Forks
- 2.5k
- Merge medio
- 1 d 3 h
- PR fusionados (30 d)
- 135
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 python-pillow/Pillow
-
Warn that pre-applying arabic_reshaper + python-bidi corrupts text on a Raqm buildPosiblemente ocupada @Syamjith-NK la tomó hace 51 días. AbiertoDocumentation Font Rendering PNG Third Party Framework
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
python-pillow/Pillow#9907 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Image.putpixel incorrectly labels supported arguments in type annotationsPosiblemente ocupada @radarhere la tomó hace 178 días. AbiertoPNG
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
python-pillow/Pillow#9584 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
ImageDraw is not translation-invariant for negative coordinates (truncation toward zero instead of floor)Posiblemente ocupada @Eryx-Z la tomó hace 2 días. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 38/100
python-pillow/Pillow#10228 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Rotated TIFF gets scrambled when opened by filenamePosiblemente ocupada @lazerg la tomó hace 3 días. Abierto🤖-assisted TIFF
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
python-pillow/Pillow#10220 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
python-pillow/Pillow#10191 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de python-pillow/Pillow
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
SACGF/variantgrid#2341 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 2 días
-
comp/cli P3 type/security
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
NousResearch/hermes-agent#141420 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
CKV_GCP_18 (GKEPublicControlPlane) passes when master_authorized_networks_config is absent, control plane is internet-reachablePosiblemente ocupada @Varshith-Kali la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bridgecrewio/checkov#7753 ·
Los mantenedores suelen responder en 1 día