Project

General

Profile

Bug #99579

Erreur à la sauvegarde d'un PicklableUpload posé en session (OSError: [Errno 9] Bad file descriptor)

Added by Sentry Io about 1 month ago. Updated about 1 month ago.

Status:
Solution déployée
Priority:
Normal
Target version:
-
Start date:
09 December 2024
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

Revision 02ec8065 (diff)
Added by Benjamin Dauvergne about 1 month ago

misc: do not close file widget value in set_value (#99579)

History

#1

Updated by Benjamin Dauvergne about 1 month ago

  • Project changed from Suivi des traces to w.c.s.
#3

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.

#4

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.

#5

Updated by Benjamin Dauvergne about 1 month ago

  • Assignee set to Benjamin Dauvergne
#6

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 :

#7

Updated by Robot Gitea about 1 month ago

  • Status changed from En cours to Solution proposée
#8

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 :

#9

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 :

#10

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 :

#11

Updated by Transition automatique about 1 month ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF