diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs index 1d9941cbc5..d07b23331f 100644 --- a/src/header/netdb/mod.rs +++ b/src/header/netdb/mod.rs @@ -1069,10 +1069,22 @@ pub unsafe extern "C" fn freeaddrinfo(res: *mut addrinfo) { unsafe { drop(Box::from_raw(bai.ai_addr.cast::())) }; } else if bai.ai_addrlen == mem::size_of::() as socklen_t { unsafe { drop(Box::from_raw(bai.ai_addr.cast::())) }; + } else if bai.ai_addrlen == mem::size_of::() as socklen_t { + unsafe { drop(Box::from_raw(bai.ai_addr.cast::())) }; + } else if bai.ai_addrlen == 0 { + // No address to free. } else { - todo_skip!(0, "freeaddrinfo: unknown ai_addrlen {}", bai.ai_addrlen); + // Unknown ai_addrlen — free as raw allocation to avoid leak. + let layout = alloc::alloc::Layout::from_size_align( + bai.ai_addrlen as usize, + mem::align_of::(), + ).unwrap_or(alloc::alloc::Layout::new::()); + unsafe { + alloc::alloc::dealloc(bai.ai_addr.cast::(), layout); + } } } + } ai = bai.ai_next; } }