Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[bug] SSH connection leaked when update_config() raises an exception

Aperta
#1,306 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@tomsebastian10 ci sta già lavorando.

Dal 21/3/2026.

  • #1307 di @mn-ram — chiusa senza merge
  • #1310 di @AYUSH676-JARVIS — chiusa senza merge

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
55/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
python

Direzione di ricerca

Inizia in openwisp_controller/connection/base/models.py intorno alle righe 365–373 e leggi il flusso di DeviceConnection.update_config(). Riproduci un invio della configurazione fallito, quindi verifica che la connessione SSH venga disconnessa sia al completamento corretto sia al completamento dovuto a un'eccezione, senza lasciare descrittori di file aperti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug

● Describe the bug

In DeviceConnection.update_config(), the SSH connection is only closed
in the else block, which means it is never disconnected when an
exception occurs during a config push. Over time this leaks SSH file
descriptors and can crash the controller process with:

OSError: [Errno 24] Too many open files

● Steps To Reproduce

  1. Set up a device with an SSH DeviceConnection
  2. Make the config push fail intentionally (e.g. wrong credentials, unreachable device, or network drop mid-transfer)
  3. Observe that no disconnect() is called — the SSH session stays open
  4. Repeat for multiple devices; file descriptor count keeps growing

● Root cause (file + line)

File: openwisp_controller/connection/base/models.py
Lines: 365–373

def update_config(self):
    self.connect()
    if self.is_working:
        try:
            self.connector_instance.update_config()
        except Exception as e:
            logger.exception(e)
        else:
            self.disconnect()  # ← only runs when NO exception is raised

The else block in a try/except/else only executes when the try
block completes without raising. Any exception causes disconnect()
to be skipped entirely.


● Expected behavior

The SSH connection should always be closed after update_config()
completes — whether it succeeded or failed — to prevent file descriptor
leaks on production controllers.


● Proposed fix

Change else to finally:

def update_config(self):
    self.connect()
    if self.is_working:
        try:
            self.connector_instance.update_config()
        except Exception as e:
            logger.exception(e)
        finally:
            self.disconnect()  # ← runs always, success OR failure

● Screenshots

Not applicable (code-level bug).


● System Information

  • OS: Ubuntu 24.04 LTS
  • Python Version: Python 3.10+
  • Django Version: Django 4.2+
  • Browser and Browser Version (if applicable): Not applicable
Lingua principale
Python
Stelle
779
Fork
328
Merge medio
2g 19h
PR unite (30g)
7

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di openwisp/openwisp-controller

Tutte le issue di openwisp/openwisp-controller

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.