This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2015年03月05日 15:08 by Patrick Miller, last changed 2022年04月11日 14:58 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| floatobject.c-patch | Patrick Miller, 2015年03月05日 15:08 | recreator and patch file | ||
| recreate.tar | Patrick Miller, 2015年03月05日 15:16 | recreator and patch file | ||
| Messages (9) | |||
|---|---|---|---|
| msg237266 - (view) | Author: Patrick Miller (Patrick Miller) | Date: 2015年03月05日 15:08 | |
There is a reference counting error in PyFloat_AsDouble. When the function calls the nb_float conversion, if the method does not return an actual float object, an exception is set, but the object is not collected. --- Objects/floatobject.c 2014年10月08日 04:18:15.000000000 -0400 +++ Objects/floatobject.c.patched 2015年03月05日 09:17:15.171455648 -0500 @@ -214,6 +214,7 @@ if (fo == NULL) return -1; if (!PyFloat_Check(fo)) { + Py_DECREF(fo); PyErr_SetString(PyExc_TypeError, "nb_float should return float object"); return -1; |
|||
| msg237268 - (view) | Author: Patrick Miller (Patrick Miller) | Date: 2015年03月05日 15:16 | |
Here's a simple recreator... It returns a 100-meg string instead of a float. The memory is leaked each time through the loop |
|||
| msg237271 - (view) | Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) | Date: 2015年03月05日 15:38 | |
Simple script to reproduce the issue:
import sys, time
class C(object):
def __float__(self):
return ""
for x in range(10000):
try:
time.sleep(C())
except TypeError:
pass
if x % 1000 == 0:
print(sys.getrefcount(""))
|
|||
| msg237272 - (view) | Author: Patrick Miller (Patrick Miller) | Date: 2015年03月05日 15:45 | |
Shout out to amaury for a much simpler recreator :-)
Checked to see if the int conversion suffered the same problem... it does not as it is structured somewhat differently. Note that it DOES do the proper DECREF (missing in PyFloat_AsDouble).
result = nb->nb_int(integral);
if (!result || PyLong_CheckExact(result))
return (PyLongObject *)result;
if (!PyLong_Check(result)) {
PyErr_Format(PyExc_TypeError,
"__int__ returned non-int (type %.200s)",
result->ob_type->tp_name);
Py_DECREF(result);
return NULL;
}
|
|||
| msg237275 - (view) | Author: Patrick Miller (Patrick Miller) | Date: 2015年03月05日 16:52 | |
This is also in the 2.7.x branch. Same patch. |
|||
| msg237335 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2015年03月06日 08:40 | |
Patch LGTM. Marking as high priority. |
|||
| msg237337 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2015年03月06日 08:55 | |
The patch should have a test before it goes in. As an aside, it's a bit disturbing that we apparently don't have any code already in our test-suite that exercises this case. |
|||
| msg237356 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2015年03月06日 14:10 | |
New changeset 30925a3b2324 by Benjamin Peterson in branch '3.4': fix potential refleak in PyFloat_AsDouble (closes #23590) https://hg.python.org/cpython/rev/30925a3b2324 New changeset f31b91b6683a by Benjamin Peterson in branch '2.7': fix potential refleak in PyFloat_AsDouble (closes #23590) https://hg.python.org/cpython/rev/f31b91b6683a New changeset 4d9594018edd by Benjamin Peterson in branch 'default': merge 3.4 (#23590) https://hg.python.org/cpython/rev/4d9594018edd |
|||
| msg237367 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2015年03月06日 16:27 | |
Thanks, Benjamin! |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:58:13 | admin | set | github: 67778 |
| 2015年03月06日 16:27:00 | mark.dickinson | set | assignee: mark.dickinson -> messages: + msg237367 |
| 2015年03月06日 14:10:04 | python-dev | set | status: open -> closed nosy: + python-dev messages: + msg237356 resolution: fixed stage: patch review -> resolved |
| 2015年03月06日 08:55:29 | mark.dickinson | set | messages: + msg237337 |
| 2015年03月06日 08:48:10 | mark.dickinson | set | assignee: mark.dickinson |
| 2015年03月06日 08:40:58 | mark.dickinson | set | priority: normal -> high nosy: + mark.dickinson messages: + msg237335 |
| 2015年03月06日 00:37:04 | pitrou | set | stage: patch review type: behavior -> resource usage versions: + Python 2.7, Python 3.5 |
| 2015年03月05日 16:52:29 | Patrick Miller | set | messages: + msg237275 |
| 2015年03月05日 15:45:07 | Patrick Miller | set | messages: + msg237272 |
| 2015年03月05日 15:38:22 | amaury.forgeotdarc | set | nosy:
+ amaury.forgeotdarc messages: + msg237271 |
| 2015年03月05日 15:16:07 | Patrick Miller | set | files:
+ recreate.tar messages: + msg237268 |
| 2015年03月05日 15:08:15 | Patrick Miller | create | |