From 47f8a552f6e3baa98d6fe785436cc2e17297af32 Mon Sep 17 00:00:00 2001 From: Misaki Shioi <31817032+shioimm@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:39:35 +0900 Subject: [PATCH] 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. --- ext/socket/ipsocket.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/ext/socket/ipsocket.c b/ext/socket/ipsocket.c index 9ad24f42b9..a3ccd9d58b 100644 --- a/ext/socket/ipsocket.c +++ b/ext/socket/ipsocket.c @@ -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;