Skip to content

Commit 47f8a55

Browse files
authored
Ensure to free fast_fallback_getaddrinfo_shared with single family (ruby#12199)
With ruby#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.
1 parent 3af1a04 commit 47f8a55

1 file changed

Lines changed: 20 additions & 16 deletions

File tree

ext/socket/ipsocket.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,26 +1192,30 @@ fast_fallback_inetsock_cleanup(VALUE v)
11921192
}
11931193

11941194
if (getaddrinfo_shared) {
1195-
int shared_need_free = 0;
1196-
int need_free[2] = { 0, 0 };
1197-
1198-
rb_nativethread_lock_lock(getaddrinfo_shared->lock);
1199-
{
1200-
for (int i = 0; i < arg->family_size; i++) {
1201-
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
1202-
need_free[i] = 1;
1195+
if (arg->family_size == 1) {
1196+
free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
1197+
} else {
1198+
int shared_need_free = 0;
1199+
int need_free[2] = { 0, 0 };
1200+
1201+
rb_nativethread_lock_lock(getaddrinfo_shared->lock);
1202+
{
1203+
for (int i = 0; i < arg->family_size; i++) {
1204+
if (arg->getaddrinfo_entries[i] && --(arg->getaddrinfo_entries[i]->refcount) == 0) {
1205+
need_free[i] = 1;
1206+
}
1207+
}
1208+
if (--(getaddrinfo_shared->refcount) == 0) {
1209+
shared_need_free = 1;
12031210
}
12041211
}
1205-
if (--(getaddrinfo_shared->refcount) == 0) {
1206-
shared_need_free = 1;
1207-
}
1208-
}
1209-
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
1212+
rb_nativethread_lock_unlock(getaddrinfo_shared->lock);
12101213

1211-
for (int i = 0; i < arg->family_size; i++) {
1212-
if (need_free[i]) free_fast_fallback_getaddrinfo_entry(&arg->getaddrinfo_entries[i]);
1214+
for (int i = 0; i < arg->family_size; i++) {
1215+
if (need_free[i]) free_fast_fallback_getaddrinfo_entry(&arg->getaddrinfo_entries[i]);
1216+
}
1217+
if (shared_need_free) free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
12131218
}
1214-
if (shared_need_free) free_fast_fallback_getaddrinfo_shared(&getaddrinfo_shared);
12151219
}
12161220

12171221
int connection_attempt_fd;

0 commit comments

Comments
 (0)