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:
Misaki Shioi 2024-11-28 22:39:35 +09:00 committed by GitHub
parent 3af1a04741
commit 47f8a552f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
Notes: git 2024-11-28 13:39:55 +00:00
Merged-By: shioimm <shioi.mm@gmail.com>

View File

@ -1192,26 +1192,30 @@ fast_fallback_inetsock_cleanup(VALUE v)
}
if (getaddrinfo_shared) {
int shared_need_free = 0;
int need_free[2] = { 0, 0 };
if (arg->family_size == 1) {
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);
{
for (int i = 0; i < arg->family_size; i++) {
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
need_free[i] = 1;
rb_nativethread_lock_lock(getaddrinfo_shared->lock);
{
for (int i = 0; i < arg->family_size; i++) {
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
need_free[i] = 1;
}
}
if (--(getaddrinfo_shared->refcount) == 0) {
shared_need_free = 1;
}
}
if (--(getaddrinfo_shared->refcount) == 0) {
shared_need_free = 1;
}
}
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
for (int i = 0; i < arg->family_size; i++) {
if (need_free[i]) free_fast_fallback_getaddrinfo_entry(&arg->getaddrinfo_entries[i]);
for (int i = 0; i < arg->family_size; 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;