Ensure to free fast_fallback_getaddrinfo_shared with single family (#12199)
With https://github.com/ruby/ruby/pull/12156, the memory of the `struct fast_fallback_getaddrinfo_shared` is now allocated even if there is only one address family. This change will always free it when `TCPSocket.new` finishes.
This commit is contained in:
parent
3af1a04741
commit
47f8a552f6
Notes:
git
2024-11-28 13:39:55 +00:00
Merged-By: shioimm <shioi.mm@gmail.com>
@ -1192,26 +1192,30 @@ fast_fallback_inetsock_cleanup(VALUE v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getaddrinfo_shared) {
|
if (getaddrinfo_shared) {
|
||||||
int shared_need_free = 0;
|
if (arg->family_size == 1) {
|
||||||
int need_free[2] = { 0, 0 };
|
free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
|
||||||
|
} else {
|
||||||
|
int shared_need_free = 0;
|
||||||
|
int need_free[2] = { 0, 0 };
|
||||||
|
|
||||||
rb_nativethread_lock_lock(getaddrinfo_shared->lock);
|
rb_nativethread_lock_lock(getaddrinfo_shared->lock);
|
||||||
{
|
{
|
||||||
for (int i = 0; i < arg->family_size; i++) {
|
for (int i = 0; i < arg->family_size; i++) {
|
||||||
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
|
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
|
||||||
need_free[i] = 1;
|
need_free[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (--(getaddrinfo_shared->refcount) == 0) {
|
||||||
|
shared_need_free = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (--(getaddrinfo_shared->refcount) == 0) {
|
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
|
||||||
shared_need_free = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
|
|
||||||
|
|
||||||
for (int i = 0; i < arg->family_size; i++) {
|
for (int i = 0; i < arg->family_size; i++) {
|
||||||
if (need_free[i]) free_fast_fallback_getaddrinfo_entry(&arg->getaddrinfo_entries[i]);
|
if (need_free[i]) free_fast_fallback_getaddrinfo_entry(&arg->getaddrinfo_entries[i]);
|
||||||
|
}
|
||||||
|
if (shared_need_free) free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
|
||||||
}
|
}
|
||||||
if (shared_need_free) free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int connection_attempt_fd;
|
int connection_attempt_fd;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user