You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
There is a reference leak in import_add_module(). PyDict_GetItemWithError() returns a borrowed reference, but PyObject_GetItem() return a non-borrowed reference. If sys.modules is not a dict, there is a reference leak. import_add_module() and several other function which return a borrowed reference should be made returning a non-borrowed reference, because there are no guaranties that general mapping keeps reference to value.
It is still not guarantee correctness of PyImport_AddModuleObject().
While testing 3.10.0rc2, I noticed that commit 4db8988 removed _PyImport_FindExtensionObject() from libpython. This breaks both PyOxidizer and py2exe, which rely on this function for a custom implementation of Loader.create_module() to enable loading Windows DLLs from memory.
It can probably be worked around. But I wanted to note it here in case it was an unwanted regression.
Please don't use private API. The underscore at the beginning marks the function as private.
(This has been the case for a long time; in 3.10 it is finally officially documented: https://docs.python.org/3.10/c-api/stable.html#stable )
It has been removed in alpha5; I'm afraid rc2 is too late to put it back. (Especially since we'd need to put it back as public API, as CPython doesn't need it any more.)
Please, if you see the need for any other private APIs, could you file bugs to make them public (or better, to support the use case they're needed for)? If they are useful, they should have documentation, tests, and better backwards compatibility expecations.
_PyImport_FindExtensionObject is a private API. It was added in 3.3 because import.c and importdl.c needed to share code. Since 3.5 it was only used in import.c, so there is no longer need to expose it. It was removed in 3.10 because there was an issue with this API: it returned a borroved reference which could be invalid at the time of returning.
I can restore and fix _PyImport_FindExtensionObject in 3.10, but is not it too later to do after 3.10.0rc2?
If it is essential to you, propose to add a new public API (perhaps better designed).
indygreg commented on Sep 28, 2021
indygregmannequin
Mannequin
More actions
I didn't want to derail this old issue too much. So I filed bpo-45307 to track a solution.
Activity
serhiy-storchaka commentedon Oct 10, 2020
There is a reference leak in import_add_module(). PyDict_GetItemWithError() returns a borrowed reference, but PyObject_GetItem() return a non-borrowed reference. If sys.modules is not a dict, there is a reference leak. import_add_module() and several other function which return a borrowed reference should be made returning a non-borrowed reference, because there are no guaranties that general mapping keeps reference to value.
It is still not guarantee correctness of PyImport_AddModuleObject().
encukou commentedon Jan 12, 2021
New changeset 4db8988 by Serhiy Storchaka in branch 'master':
bpo-41994: Fix refcount issues in Python/import.c (GH-22632)
4db8988
serhiy-storchaka commentedon Jan 12, 2021
Thank you Petr!
indygreg commentedon Sep 27, 2021
While testing 3.10.0rc2, I noticed that commit 4db8988 removed _PyImport_FindExtensionObject() from libpython. This breaks both PyOxidizer and py2exe, which rely on this function for a custom implementation of Loader.create_module() to enable loading Windows DLLs from memory.
It can probably be worked around. But I wanted to note it here in case it was an unwanted regression.
encukou commentedon Sep 27, 2021
Please don't use private API. The underscore at the beginning marks the function as private.
(This has been the case for a long time; in 3.10 it is finally officially documented: https://docs.python.org/3.10/c-api/stable.html#stable )
It has been removed in alpha5; I'm afraid rc2 is too late to put it back. (Especially since we'd need to put it back as public API, as CPython doesn't need it any more.)
Please, if you see the need for any other private APIs, could you file bugs to make them public (or better, to support the use case they're needed for)? If they are useful, they should have documentation, tests, and better backwards compatibility expecations.
serhiy-storchaka commentedon Sep 27, 2021
_PyImport_FindExtensionObject is a private API. It was added in 3.3 because import.c and importdl.c needed to share code. Since 3.5 it was only used in import.c, so there is no longer need to expose it. It was removed in 3.10 because there was an issue with this API: it returned a borroved reference which could be invalid at the time of returning.
I can restore and fix _PyImport_FindExtensionObject in 3.10, but is not it too later to do after 3.10.0rc2?
If it is essential to you, propose to add a new public API (perhaps better designed).
indygreg commentedon Sep 28, 2021
I didn't want to derail this old issue too much. So I filed bpo-45307 to track a solution.