New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PyFile_FromString leaks file descriptors in python 2.7 #58710
Comments
[forwarded from http://bugs.debian.org/664529] seen with 2.7.3 rc2 File descriptors opened by PyFile_FromString don't get closed when the Here's my test program, pythony.c: #include <Python.h>
int main()
{
int i = 0;
PyObject *obj;
Py_Initialize();
while (i++ < 5) {
obj = PyFile_FromString("hello.py", "r");
assert(obj);
Py_DECREF(obj);
}
Py_Finalize();
} hello.py is 'print("hello world")'. I'm compiling it with both Python 2.6 and 2.7. $ strace ./pythony-2.6 2>&1 | tail -n 20
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffb1d097b0) = -1 EINVAL (Invalid argument)
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffb1d097b0) = -1 EINVAL (Invalid argument)
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
close(3) = 0
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
close(3) = 0
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
close(3) = 0
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
close(3) = 0
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
close(3) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f1e1a0224f0}, {0x7f1e1a49a160, [], SA_RESTORER, 0x7f1e1a0224f0}, 8) = 0
exit_group(0) = ?
$ strace ./pythony-2.7 2>&1 | tail -n 20
fstat(4, {st_mode=S_IFREG|0644, st_size=1950, ...}) = 0
read(4, "", 4096) = 0
close(4) = 0
munmap(0x7fa41f10f000, 4096) = 0
close(3) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7ffff7bd33f0) = -1 EINVAL (Invalid argument)
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7ffff7bd33f0) = -1 EINVAL (Invalid argument)
open("hello.py", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
open("hello.py", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
open("hello.py", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
open("hello.py", O_RDONLY) = 6
fstat(6, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
open("hello.py", O_RDONLY) = 7
fstat(7, {st_mode=S_IFREG|0644, st_size=21, ...}) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7fa4206e24f0}, {0x7fa420b8dd50, [], SA_RESTORER, 0x7fa4206e24f0}, 8) = 0
exit_group(0) = ? The Python 2.7 version never calls close, not even at Py_Finalize(). On #d-d, jwilk suspected that this change might be the cause: |
Correct, PyFile_FromString() doesn't close the file descriptor, even if you call its close() method. You have to call manually fclose(file->f_fp). Or you can use PyFile_FromFile: fp = fopen(name, mode);
if (fp == NULL) ...
obj = PyFile_FromFile(fp, name, mode, fclose);
if (obj == NULL) {
/* no need to call fclose(fp) here, it's done by PyFile_FromFile() */
...
}
...
Py_DECREF(obj); Would you like to write a patch for the documentation? |
Victor, that sounds like a strange behaviour to me. PyFile_FromString is a public API and maybe it shouldn't have changed between 2.6 and 2.7. |
We may change PyFile_FromString() to call fclose() when the file is
PyFile_FromString() didn't change in Python 2.7. I changed PyFile_FromFile() in Python 2.7 to fix the issue bpo-7732. changeset: 72456:0f5b64630fda PyFile_FromFile() does also close the file if PyString_FromString() failed. It |
Victor, what exactly are you talking about? http://hg.python.org/cpython/rev/0f5b64630fda/ *does* change PyFile_FromString. |
New changeset 8258e5fa4a19 by Antoine Pitrou in branch '2.7': |
Matthias, this should be fixed now. |
Oh. I don't know (remember) why I did this change!? I suppose that I |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: