Steve Dower <steve.do...@python.org> added the comment:

> That will require rewriting many scripts and packages that use ctypes or cffi
> to load DLLs. It would also break DLLs that internally rely on modifying PATH
> for a delayed load, though I hope that's uncommon. I think it's easier for
> everyone else if we implement this just for extension-module loading with the
> LoadLibraryExW flags.

Only if they're loading them via PATH. If they're using full paths they'll be 
fine, and if they're using system DLLs they'll be fine. In both cases, the fix 
will work (better) with existing versions.

> Also, if I'm understanding your intention, loading an extension may fail when
> Python is embedded if the process is using the legacy DLL search path.

That's true. "import" will always use the secure flags, and so if you were 
relying on PATH to locate dependencies of the extension module (note that 
extension modules themselves are loaded by full path, so it doesn't apply to 
them), you need to stop doing that.

> Also, at runtime we can raise a SystemError if AddDllDirectory isn't found via
> GetProcAddress. This supports portable Python installations.

This adds a lot of complexity for very old Windows 7 installs. I'm not inclined 
to care that much for them - installing security updates isn't a big ask for a 
nearly EOL operating system.

> Correct me if I'm wrong, but once SetDefaultDllDirectories() is used, there is
> no going back: PATH no longer can change the search path no matter what flags
> are used with LoadLibrary* calls

Correct. But this is already the case if your sysadmin has enabled certain 
policies or if you're running via Store Python. So you can't rely on PATH 
anyway.

> Why is this CPython-specific and "private"? It seems like
> * it should be a public interface, used by all implementations consistently,
> as a policy decision for the win32 platform and documented as such

Not every implementation has to support Windows. We can certainly recommend 
that those that do copy it, but I'm not going to force MicroPython to declare 
an exception from a standard Python API.

> * located in os, much like os.environ (not critical)

Fair point. It can go into os. :)

> There should be some kind of debugging tool for when LoadLibraryEx fails, to
> indicate what might have gone wrong, perhaps os.getdlldirectory() would be
> helpful

I'd love to have this. Now someone just has to invent one that can be used from 
Python :) It's unrelated to this discussion - in fact, this change will make it 
so that you get the failure on _all_ machines, not just on some random user's 
machine.

We can't retrieve the true search path, only the ones that were added through 
an API that we control and making assumptions based on the documentation. I 
think this would be more of a distraction. The best way to diagnose actual 
LoadLibrary failures is to use a debugger, at which point simply getting the 
search paths doesn't add anything.

> This bothers me - how will backward compatibility work in that case?

The new search order is compatible with the old search order, so you can update 
all your layouts to have DLL dependencies in suitable locations and you'll be 
fine.

And if you're still writing code for Windows 7 with no security updates 
installed, Python 3.8 isn't going to save you anyway.

> I really have no feel as to what practical impact there would be on an
> embedded application.

Since we're not going to change the default search directories for the entire 
process when embedding, the only practical impact is that your extension 
modules need to have their dependent DLLs either:
* in the system directory
* adjacent to the .pyd file
* in a directory added using AddDllDirectory

And if the embedding application is already calling SetDefaultDllDirectories, 
as has been recommended for years, then they're already experiencing this 
change and won't have to update a thing.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36085>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to