Skip to content

gh-127081: fix some un-thread-safe use of libc functions #132591

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

Closed
wants to merge 8 commits into from

Conversation

duaneg
Copy link

@duaneg duaneg commented Apr 16, 2025

Add configure tests and defines for getservbyname_r, getservbyport_r, and getprotobyname_r. Use these if available, otherwise fallback to the thread-unsafe variants.

Add a unit test to exercise getprotobyname, which is currently untested.

TODO:

  • Are there any platforms which define the unsafe variants but not the re-entrant ones? If not we can simplify the #ifdef hell somewhat.
  • Do the re-entrant functions have the same signature on all platforms?
  • These changes follow the existing code's practice: allocate a fixed-size (and overly large) buffer, and don't properly handle the error case if it is too small. Should this be fixed? If so should existing code also be fixed?

Add configure tests and defines for getservbyname_r, getservbyport_r, and
getprotobyname_r. Use these if available, otherwise fallback to the
thread-unsafe variants.

Add a unit test to exercise getprotobyname, which is currently untested.

TODO:
 - Are there any platforms which define the unsafe variants but not the
   re-entrant ones? If not we can simplify the #ifdef hell somewhat.
 - Do the re-entrant functions have the same signature on all platforms?
 - These changes follow the existing code's practice: allocate a fixed-size
   (and overly large) buffer, and don't properly handle the error case if it is
   too small. Should this be fixed? If so should existing code also be fixed?
duaneg added 3 commits April 17, 2025 10:00
The libc setpwent, getpwent, and endpwent functions are not thread-safe.
Protect them with mutexs in free-threading builds.
The dbm_* functions are not thread-safe, naturally. Add critical sections to
protect their use.
The getlogin function is not thread-safe: replace with getlogin_r where
available.

Note that this function is untested (unit test is skipped with a note it caused
CI failures as behaviour differs between NIX environments).
@duaneg duaneg changed the title gh-127081: use re-entrant variants of get{proto,serv}by{name,port} gh-127081: fix some un-thread-safe use of libc functions Apr 17, 2025
@picnixz
Copy link
Member

picnixz commented Apr 20, 2025

Can you split the PR into multiple ones where each PR is dedicated to a single module please (dbm and gdbm can be put together)? it's easier to revert commits if needs arise and we can also merge them separately.

@duaneg
Copy link
Author

duaneg commented Apr 20, 2025

Can you split the PR into multiple ones where each PR is dedicated to a single module please (dbm and gdbm can be put together)? it's easier to revert commits if needs arise and we can also merge them separately.

Definitely! Good suggestion, thanks.

@duaneg duaneg closed this Apr 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants