tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PROPOSAL: new libc function allocaddrinfo()
In article <B310C220-11A9-42E9-9D2D-ACC01EA886A9%sarna.org@localhost>,
Ty Sarna <ty%sarna.org@localhost> wrote:
>Writing a nsswitch plugin for getaddrinfo turns out to be rather
>annoying, because there is no good mechanism to safely allocate the
>"struct addrinfo" objects to be returned. The naive implementation
>would be to malloc a struct addrinfo, and then malloc separately for
>the ai_addr field. However, this results in a leak, because our
>freeaddrinfo() does not free ai_addr.
>
>Looking at the libc source, one can see that the addrinfo and sockaddr
>are allocated together, and copy that approach, however depending on
>undocumented implementation details like that is a recipe for trouble.
>There is nothing to say that NetBSD cannot switch to using separate
>allocations in the future, or that it even has to use malloc at all,
>for that matter.
>
>The only safe way for a nss getaddrinfo plugin to obtain new addrinfos
>seems to be to recursively call getaddrinfo again in such a way as to
>cause it to return a addrinfo with the appropriate sockaddr allocted
>(eg inet_ntop the address back to text, and look up with
>AI_NUMERICHOST) and then fiddle with the result. This is non-obvious,
>needlessly cumbersome, and inefficient.
>
>I propose to solve this by introducing a new libc function:
>
> struct addrinfo *allocaddrinfo(socklen_t addrlen)
>
>Which guarantees to allocate a struct addrinfo and associated ai_addr
>memory of the given size in a way that is compatible with
>freeaddrinfo. We should also document that ai_canonname is managed
>with malloc/free and that it is safe for nss plugins to depend on that
>fact.
>
>Internally, libc/net/getaddrinfo.c:get_ai() can also be changed to use
>allocaddrinfo().
Sure, I don't see a problem with that.
christos
Home |
Main Index |
Thread Index |
Old Index