Bug #99579
Erreur à la sauvegarde d'un PicklableUpload posé en session (OSError: [Errno 9] Bad file descriptor)
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/135737/
OSError: [Errno 9] Bad file descriptor File "wcs/qommon/upload_storage.py", line 192, in save upload.fp = open(upload.fp.name, 'rb') # pylint: disable=consider-using-with File "wcs/qommon/upload_storage.py", line 45, in __getstate__ get_storage_object(getattr(self, 'storage', None)).save(self) File "wcs/sql.py", line 3912, in store 'data': bytearray(pickle.dumps(self.data, protocol=2)) if self.data is not None else None, File "wcs/sql.py", line 3986, in store v.store() File "wcs/qommon/sessions.py", line 367, in __setitem__ session.store() ... (5 additional frame(s) were not displayed)
Associated revisions
History
Updated by Frédéric Péters about 1 month ago
Ça vient vraisemblablement de #98182; dans les traces liées il y a :
subprocess, gm convert +profile "*" HEIC:- JPEG:-
je ne sais pas si c'est une information fiable.
Updated by Benjamin Dauvergne about 1 month ago
Ok j'ai compris le truc, PicklableUpload descend de Upload dans quixote.http_request, celui-ci définit Upload.receive() (la fonction principale pour ajouter du contenu à un objet Upload) ainsi :
def receive(self, lines): self.fp = tempfile.TemporaryFile("w+b") for line in lines: self.fp.write(line) self.fp.seek(0)
Un fichier créé via tempfile.TemporaryFile n'a pas de nom fd.name est remplacé par l'entier du descripteur de fichier associé:
>>> fd = tempfile.TemporaryFile('w+b') >>> fd.name 3 >>> type(fd.name) <class 'int'> >>> fd.close() >>> open(fd.name) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 9] Bad file descriptor
et quand on passe un entier à
open
je suppose qu'il essaie bête de recréer un objet fichier python autour sans même le dupliquer:>>> fd = tempfile.TemporaryFile('w+b') >>> fd2 = open(fd.name) >>> fd.fileno() 3 >>> fd.name 3
et donc s'il est déjà fermé ou fermé plus tard (ce qui arrive je suppose dans le cas atomic_write()/read()) boom
Bad file descriptor
.
On ne peut pas faire upload.fd.close()
et supposer que quoi que ce soit de upload.fd
(comme upload.fd.name) soit encore utilisable.
Updated by Robot Gitea about 1 month ago
- Status changed from Nouveau to En cours
Benjamin Dauvergne (bdauvergne) a ouvert une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/wcs/pulls/2028
- Titre : WIP: Ne pas fermer upload.fp quand upload.fp est un TemporaryFile() (#99579)
- Modifications : https://git.entrouvert.org/entrouvert/wcs/pulls/2028/files
Updated by Robot Gitea about 1 month ago
Benjamin Dauvergne (bdauvergne) a demandé une relecture de Frédéric Péters (fpeters) sur une pull request sur Gitea concernant cette demande :
Updated by Robot Gitea about 1 month ago
- Status changed from Solution proposée to Solution validée
Frédéric Péters (fpeters) a approuvé une pull request sur Gitea concernant cette demande :
Updated by Robot Gitea about 1 month ago
- Status changed from Solution validée to Résolu (à déployer)
Benjamin Dauvergne (bdauvergne) a mergé une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/wcs/pulls/2028
- Titre : Ne pas fermer upload.fp quand upload.fp est un TemporaryFile() (#99579)
- Modifications : https://git.entrouvert.org/entrouvert/wcs/pulls/2028/files
Updated by Transition automatique about 1 month ago
- Status changed from Résolu (à déployer) to Solution déployée
misc: do not close file widget value in set_value (#99579)