From 485c50228a4dce38b1766173d3504b174475fd18 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 16 Sep 2022 18:32:19 +0200 Subject: [PATCH] explicitly close cursor if not needed anymore (GC can grab it late) --- fail2ban/server/database.py | 50 +++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/fail2ban/server/database.py b/fail2ban/server/database.py index 33fb183fd..5fd00fadd 100644 --- a/fail2ban/server/database.py +++ b/fail2ban/server/database.py @@ -104,7 +104,11 @@ def commitandrollback(f): def wrapper(self, *args, **kwargs): with self._lock: # Threading lock with self._db: # Auto commit and rollback on exception - return f(self, self._db.cursor(), *args, **kwargs) + cur = self._db.cursor() + try: + return f(self, cur, *args, **kwargs) + finally: + cur.close() return wrapper @@ -747,34 +751,36 @@ class Fail2BanDb(object): query += " GROUP BY ip ORDER BY ip, timeofban DESC" else: query += " ORDER BY timeofban DESC LIMIT 1" - cur = self._db.cursor() return cur.execute(query, queryArgs) def getCurrentBans(self, jail = None, ip = None, forbantime=None, fromtime=None, maxmatches=None): tickets = [] ticket = None - with self._lock: - results = list(self._getCurrentBans(self._db.cursor(), - jail=jail, ip=ip, forbantime=forbantime, fromtime=fromtime)) - - if results: - for banip, timeofban, data in results: - # logSys.debug('restore ticket %r, %r, %r', banip, timeofban, data) - ticket = FailTicket(banip, timeofban, data=data) - # filter matches if expected (current count > as maxmatches specified): - if maxmatches is None: - maxmatches = self.maxMatches - if maxmatches: - matches = ticket.getMatches() - if matches and len(matches) > maxmatches: - ticket.setMatches(matches[-maxmatches:]) - else: - ticket.setMatches(None) - # logSys.debug('restored ticket: %r', ticket) - if ip is not None: return ticket - tickets.append(ticket) + try: + with self._lock: + cur = self._db.cursor() + results = list(self._getCurrentBans(self._db.cursor(), + jail=jail, ip=ip, forbantime=forbantime, fromtime=fromtime)) + if results: + for banip, timeofban, data in results: + # logSys.debug('restore ticket %r, %r, %r', banip, timeofban, data) + ticket = FailTicket(banip, timeofban, data=data) + # filter matches if expected (current count > as maxmatches specified): + if maxmatches is None: + maxmatches = self.maxMatches + if maxmatches: + matches = ticket.getMatches() + if matches and len(matches) > maxmatches: + ticket.setMatches(matches[-maxmatches:]) + else: + ticket.setMatches(None) + # logSys.debug('restored ticket: %r', ticket) + if ip is not None: return ticket + tickets.append(ticket) + finally: + cur.close() return tickets @commitandrollback