Wrap do_fast_fallback_getaddrinfo with rb_thread_prevent_fork (#12366)

Wrap `do_fast_fallback_getaddrinfo` with `rb_thread_prevent_fork`

Referencing PR #10864,
wrap `do_fast_fallback_getaddrinfo` with `rb_thread_prevent_fork`
to avoid fork safety issues.

`do_fast_fallback_getaddrinfo` internally uses getaddrinfo(3),
leading to fork safety issues, as described in PR #10864.
This change ensures that `do_fast_fallback_getaddrinfo`
is guarded by `rb_thread_prevent_fork`,
preventing fork during its execution and avoiding related issues.
This commit is contained in:
Misaki Shioi 2024-12-18 09:48:26 +09:00 committed by GitHub
parent 98bf912d4b
commit 498d6eb114
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
Notes: git 2024-12-18 00:48:46 +00:00
Merged-By: shioimm <shioi.mm@gmail.com>
3 changed files with 9 additions and 3 deletions

View File

@ -637,7 +637,7 @@ init_fast_fallback_inetsock_internal(VALUE v)
}
}
if (raddrinfo_pthread_create(&threads[i], do_fast_fallback_getaddrinfo, arg->getaddrinfo_entries[i]) != 0) {
if (raddrinfo_pthread_create(&threads[i], fork_safe_do_fast_fallback_getaddrinfo, arg->getaddrinfo_entries[i]) != 0) {
rsock_raise_resolution_error("getaddrinfo(3)", EAI_AGAIN);
}
pthread_detach(threads[i]);

View File

@ -3048,7 +3048,7 @@ free_fast_fallback_getaddrinfo_entry(struct fast_fallback_getaddrinfo_entry **en
*entry = NULL;
}
void *
static void *
do_fast_fallback_getaddrinfo(void *ptr)
{
struct fast_fallback_getaddrinfo_entry *entry = (struct fast_fallback_getaddrinfo_entry *)ptr;
@ -3117,6 +3117,12 @@ do_fast_fallback_getaddrinfo(void *ptr)
return 0;
}
void *
fork_safe_do_fast_fallback_getaddrinfo(void *ptr)
{
return rb_thread_prevent_fork(do_fast_fallback_getaddrinfo, ptr);
}
#endif
/*

View File

@ -447,7 +447,7 @@ struct fast_fallback_getaddrinfo_shared
};
int raddrinfo_pthread_create(pthread_t *th, void *(*start_routine) (void *), void *arg);
void *do_fast_fallback_getaddrinfo(void *ptr);
void *fork_safe_do_fast_fallback_getaddrinfo(void *ptr);
void free_fast_fallback_getaddrinfo_entry(struct fast_fallback_getaddrinfo_entry **entry);
void free_fast_fallback_getaddrinfo_shared(struct fast_fallback_getaddrinfo_shared **shared);
# endif