Repository navigation
[ctypes][linux] ctypes.util.find_library() crash instead of return None #114257
Copy link
Copy link
Closed
Labels
3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13only security fixesonly security fixestopic-ctypestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
The problem:
ctypes.util.find_library() raises an exception on certain inputs when it cannot find it.
Expected behavior:
No exception, return None as advertised if it cannot find the library.
Reproducer:
# on python 3.10, but same deal on other versions too
>>> import ctypes.util
>>> ctypes.util.find_library('libgomp')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/path/to/lib/python3.10/ctypes/util.py", line 351, in find_library
_get_soname(_findLib_gcc(name)) or _get_soname(_findLib_ld(name))
File "/path/to/lib/python3.10/ctypes/util.py", line 148, in _findLib_gcc
if not _is_elf(file):
File "/path/to/lib/python3.10/ctypes/util.py", line 100, in _is_elf
with open(filename, 'br') as thefile:
FileNotFoundError: [Errno 2] No such file or directory: b'liblibgomp.a'Note that the crash does not occur if you put nonsense in:
find_library('asdadsas')-> OKfind_library('libasdasdasd')-> OK
The problem appears to be a bit more contrived. Python is attempting to parse the output from gcc, which in this case is:
/usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu/Scrt1.o
/usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/12/crtbeginS.o
/usr/bin/ld: cannot find -llibgomp: No such file or directory
/usr/bin/ld: note to link with /usr/lib/gcc/x86_64-linux-gnu/12/libgomp.a use -l:libgomp.a or rename it to liblibgomp.a
/usr/lib/gcc/x86_64-linux-gnu/12/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/12/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu/libgcc_s.so.1
/usr/lib/gcc/x86_64-linux-gnu/12/libgcc.a
collect2: error: ld returned 1 exit status
But then the parser is getting confused trying to parse the useful diagnostic message mentioning libgomp.a.
Machine details (from platform.uname())
uname_result(system='Linux', node='iblis', release='6.5.0-14-generic', version='#14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2', machine='x86_64')
CPython versions tested on:
3.10, 3.11, 3.12
Operating systems tested on:
Linux
Linked PRs
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13only security fixesonly security fixestopic-ctypestype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Activity
Jacobfaib commentedon Jan 18, 2024
cc @manopapad
manopapad commentedon Jan 18, 2024
Full output with some prints (python pulled from conda-forge):
I assume the double "lib" is intentional, and this call was meant to fail, and just ended up mis-parsing an unrelated part of the output diagnostic message.
aisk commentedon Jan 21, 2024
The
find_libraryfunction will invoke gcc and search for any matches to the patternlib{name}(in this case,liblibgomp) in its output.In the new version of gcc, it will display a recommendation tip in case you add the unnecessary
libprefix, like:If a matching result, such as
liblibgomp.a, is found, it will be used as an argument to_is_elf. Unfortunately, if the file does not exist or for any other reason when it's opened, it will raise an error.I'm not sure if any other
OSErrorshould be ignored, but at leastFileNotFoundErrorshould be ignored in this case.pythongh-114257: Ignore the `FileNotFound` error in `ctypes.util._is_…
gh-114257: Ignore the FileNotFound error in ctypes.util._is_elf() (GH…
pythongh-114257: Ignore the FileNotFound error in ctypes.util._is_elf…
pythongh-114257: Ignore the FileNotFound error in ctypes.util._is_elf…
[3.12] gh-114257: Ignore the FileNotFound error in ctypes.util._is_el…
[3.11] gh-114257: Ignore the FileNotFound error in ctypes.util._is_el…
pythongh-114257: Ignore the FileNotFound error in ctypes.util._is_elf…
pythongh-114257: Ignore the FileNotFound error in ctypes.util._is_elf…