[swift-users] POSIX getaddrinfo memory behaviour

Etan Kissling kissling at oberon.ch
Tue Oct 4 11:46:36 CDT 2016


POSIX getaddrinfo allocates memory that must later be freed using freeaddrinfo.
See http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.html

To simplify the API, I've created this function:

        import Foundation
        
        enum SystemError: Swift.Error {
            case getaddrinfo(Int32, Int32?)
        }
        
        public func getaddrinfo(node: String?, service: String?, hints: addrinfo?) throws -> [addrinfo] {
            var err: Int32
            var res: UnsafeMutablePointer<addrinfo>?
            if var hints = hints {
                err = getaddrinfo(node, service, &hints, &res)
            } else {
                err = getaddrinfo(node, service, nil, &res)
            }
            if err == EAI_SYSTEM {
                throw SystemError.getaddrinfo(err, errno)
            }
            if err != 0 {
                throw SystemError.getaddrinfo(err, nil)
            }
            defer {
                freeaddrinfo(res)
            }
            var result = [addrinfo]()
            var ai = res?.pointee
            while ai != nil {
                result.append(ai!)
                ai = ai!.ai_next?.pointee
            }
            return result
        }
        
I don't feel that the function is correct, though.

• How can the Swift memory model know that getaddrinfo allocates memory, and that Swift should not overwrite that memory with own stuff?
• How can Swift know that freeaddrinfo deletes the whole list, and that it should copy out ai information that has been assigned to the result array?

What's the correct way to interface with getaddrinfo?

Thanks

Etan




More information about the swift-users mailing list