Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f4d4f8b

Browse files
committed
Explicitly close pipes so test_ctypes won't appear to randomly leak
+33 or -33 references. (See discussion in #1597.)
1 parent b8189f3 commit f4d4f8b

1 file changed

Lines changed: 34 additions & 9 deletions

File tree

Lib/ctypes/util.py

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ def _findLib_gcc(name):
5050
'$CC -Wl,-t -o ' + ccout + ' 2>&1 -l' + name
5151
try:
5252
f = os.popen(cmd)
53-
trace = f.read()
54-
f.close()
53+
try:
54+
trace = f.read()
55+
finally:
56+
f.close()
5557
finally:
5658
try:
5759
os.unlink(ccout)
@@ -70,7 +72,12 @@ def _get_soname(f):
7072
if not f:
7173
return None
7274
cmd = "/usr/ccs/bin/dump -Lpv 2>/dev/null " + f
73-
res = re.search(r'\[.*\]\sSONAME\s+([^\s]+)', os.popen(cmd).read())
75+
f = os.popen(cmd)
76+
try:
77+
data = f.read()
78+
finally:
79+
f.close()
80+
res = re.search(r'\[.*\]\sSONAME\s+([^\s]+)', data)
7481
if not res:
7582
return None
7683
return res.group(1)
@@ -80,7 +87,12 @@ def _get_soname(f):
8087
if not f:
8188
return None
8289
cmd = "objdump -p -j .dynamic 2>/dev/null " + f
83-
res = re.search(r'\sSONAME\s+([^\s]+)', os.popen(cmd).read())
90+
f = os.popen(cmd)
91+
try:
92+
data = f.read()
93+
finally:
94+
f.close()
95+
res = re.search(r'\sSONAME\s+([^\s]+)', data)
8496
if not res:
8597
return None
8698
return res.group(1)
@@ -103,8 +115,12 @@ def _num_version(libname):
103115
def find_library(name):
104116
ename = re.escape(name)
105117
expr = r':-l%s\.\S+ => \S*/(lib%s\.\S+)' % (ename, ename)
106-
res = re.findall(expr,
107-
os.popen('/sbin/ldconfig -r 2>/dev/null').read())
118+
f = os.popen('/sbin/ldconfig -r 2>/dev/null')
119+
try:
120+
data = f.read()
121+
finally:
122+
f.close()
123+
res = re.findall(expr, data)
108124
if not res:
109125
return _get_soname(_findLib_gcc(name))
110126
res.sort(cmp= lambda x,y: cmp(_num_version(x), _num_version(y)))
@@ -115,12 +131,21 @@ def find_library(name):
115131
def _findLib_ldconfig(name):
116132
# XXX assuming GLIBC's ldconfig (with option -p)
117133
expr = r'/[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)
118-
res = re.search(expr,
119-
os.popen('/sbin/ldconfig -p 2>/dev/null').read())
134+
f = os.popen('/sbin/ldconfig -p 2>/dev/null')
135+
try:
136+
data = f.read()
137+
finally:
138+
f.close()
139+
res = re.search(expr, data)
120140
if not res:
121141
# Hm, this works only for libs needed by the python executable.
122142
cmd = 'ldd %s 2>/dev/null' % sys.executable
123-
res = re.search(expr, os.popen(cmd).read())
143+
f = os.popen(cmd)
144+
try:
145+
data = f.read()
146+
finally:
147+
f.close()
148+
res = re.search(expr, data)
124149
if not res:
125150
return None
126151
return res.group(0)

0 commit comments

Comments
 (0)