From 47dc1b5b92c1df1c76f03e35626b2e6f092901c3 Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Sun, 19 Jan 2020 10:44:40 +0100 Subject: [PATCH] loop: don't leak open fd to /dev Close the file descriptor to `/dev` when we opened it. --- osbuild/loop.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/osbuild/loop.py b/osbuild/loop.py index 3788036e..c5e59a2d 100644 --- a/osbuild/loop.py +++ b/osbuild/loop.py @@ -1,3 +1,4 @@ +import contextlib import ctypes import fcntl import os @@ -92,11 +93,15 @@ class Loop: expected device node """ - if not dir_fd: - dir_fd = os.open("/dev", os.O_DIRECTORY) self.devname = f"loop{minor}" self.minor = minor - self.fd = os.open(self.devname, os.O_RDWR, dir_fd=dir_fd) + + with contextlib.ExitStack() as stack: + if not dir_fd: + dir_fd = os.open("/dev", os.O_DIRECTORY) + stack.callback(lambda: os.close(dir_fd)) + self.fd = os.open(self.devname, os.O_RDWR, dir_fd=dir_fd) + info = os.stat(self.fd) if ((not stat.S_ISBLK(info.st_mode)) or (not os.major(info.st_rdev) == self.LOOP_MAJOR) or