Skip to content

Commit 498d6eb

Browse files
authored
Wrap do_fast_fallback_getaddrinfo with rb_thread_prevent_fork (ruby#12366)
Wrap `do_fast_fallback_getaddrinfo` with `rb_thread_prevent_fork` Referencing PR ruby#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 ruby#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.
1 parent 98bf912 commit 498d6eb

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

ext/socket/ipsocket.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ init_fast_fallback_inetsock_internal(VALUE v)
637637
}
638638
}
639639

640-
if (raddrinfo_pthread_create(&threads[i], do_fast_fallback_getaddrinfo, arg->getaddrinfo_entries[i]) != 0) {
640+
if (raddrinfo_pthread_create(&threads[i], fork_safe_do_fast_fallback_getaddrinfo, arg->getaddrinfo_entries[i]) != 0) {
641641
rsock_raise_resolution_error("getaddrinfo(3)", EAI_AGAIN);
642642
}
643643
pthread_detach(threads[i]);

ext/socket/raddrinfo.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3048,7 +3048,7 @@ free_fast_fallback_getaddrinfo_entry(struct fast_fallback_getaddrinfo_entry **en
30483048
*entry = NULL;
30493049
}
30503050

3051-
void *
3051+
static void *
30523052
do_fast_fallback_getaddrinfo(void *ptr)
30533053
{
30543054
struct fast_fallback_getaddrinfo_entry *entry = (struct fast_fallback_getaddrinfo_entry *)ptr;
@@ -3117,6 +3117,12 @@ do_fast_fallback_getaddrinfo(void *ptr)
31173117
return 0;
31183118
}
31193119

3120+
void *
3121+
fork_safe_do_fast_fallback_getaddrinfo(void *ptr)
3122+
{
3123+
return rb_thread_prevent_fork(do_fast_fallback_getaddrinfo, ptr);
3124+
}
3125+
31203126
#endif
31213127

31223128
/*

ext/socket/rubysocket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ struct fast_fallback_getaddrinfo_shared
447447
};
448448

449449
int raddrinfo_pthread_create(pthread_t *th, void *(*start_routine) (void *), void *arg);
450-
void *do_fast_fallback_getaddrinfo(void *ptr);
450+
void *fork_safe_do_fast_fallback_getaddrinfo(void *ptr);
451451
void free_fast_fallback_getaddrinfo_entry(struct fast_fallback_getaddrinfo_entry **entry);
452452
void free_fast_fallback_getaddrinfo_shared(struct fast_fallback_getaddrinfo_shared **shared);
453453
# endif

0 commit comments

Comments
 (0)