python: Don't leak file handles
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Wed, 1 Sep 2021 03:42:28 +0000 (15:42 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 21 Sep 2021 23:05:41 +0000 (23:05 +0000)
Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Noel Power <npower@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/__init__.py
python/samba/ms_schema.py
python/samba/schema.py

index 449e4826ffb4109b93c65ac90b372c01fa83b0fe..0e6a33322f8cae0b81611530867ce8a0228379f0 100644 (file)
@@ -217,7 +217,8 @@ class Ldb(_Ldb):
 
         :param ldif_path: Path to LDIF file.
         """
-        self.add_ldif(open(ldif_path, 'r').read())
+        with open(ldif_path, 'r') as ldif_file:
+            self.add_ldif(ldif_file.read())
 
     def add_ldif(self, ldif, controls=None):
         """Add data based on a LDIF string.
@@ -279,10 +280,11 @@ def read_and_sub_file(file_name, subst_vars):
     :param file_name: File to be read (typically from setup directory)
      param subst_vars: Optional variables to subsitute in the file.
     """
-    data = open(file_name, 'r', encoding="utf-8").read()
-    if subst_vars is not None:
-        data = substitute_var(data, subst_vars)
-        check_all_substituted(data)
+    with open(file_name, 'r', encoding="utf-8") as data_file:
+        data = data_file.read()
+        if subst_vars is not None:
+            data = substitute_var(data, subst_vars)
+            check_all_substituted(data)
     return data
 
 
index b9ca3c61b7209101fee9010e8a9880c9473a55af..2250fb55e3b1f997ceeb0ea204cfb50213531716 100644 (file)
@@ -294,9 +294,9 @@ def __parse_schema_file(filename, objectClass):
     out = []
 
     from io import open
-    f = open(filename, "r", encoding='latin-1')
-    for entry in __read_raw_entries(f):
-        out.append(__write_ldif_one(__transform_entry(entry, objectClass)))
+    with open(filename, "r", encoding='latin-1') as f:
+        for entry in __read_raw_entries(f):
+            out.append(__write_ldif_one(__transform_entry(entry, objectClass)))
 
     return "\n\n".join(out)
 
index 54fc9fc31259a0a870e062f0ac2d6c639aa2d4ea..a3adc162fa3817b5e6c2d750112db09895fba4d7 100644 (file)
@@ -110,8 +110,13 @@ class Schema(object):
             setup_path('ad-schema/%s' % Schema.base_schemas[base_schema][0]),
             setup_path('ad-schema/%s' % Schema.base_schemas[base_schema][1]))
 
+        def read_file(file):
+            with open(file, 'rb') as data_file:
+                return data_file.read()
+
         if files is not None:
-            self.schema_data = "".join(get_string(open(file, 'rb').read()) for file in files)
+            self.schema_data = "".join(get_string(read_file(file))
+                                       for file in files)
 
         self.schema_data = substitute_var(self.schema_data,
                                           {"SCHEMADN": schemadn})
@@ -130,7 +135,7 @@ class Schema(object):
         if override_prefixmap is not None:
             self.prefixmap_data = override_prefixmap
         else:
-            self.prefixmap_data = open(setup_path("prefixMap.txt"), 'rb').read()
+            self.prefixmap_data = read_file(setup_path("prefixMap.txt"))
 
         if additional_prefixmap is not None:
             self.prefixmap_data += "".join("%s\n" % map for map in additional_prefixmap)