if (full)
{
+ /* Sometimes sa_family is only filled in correctly in the
+ interface address, not the netmask, so copy it across
+ (Bug#74907). */
+ it->ifa_netmask->sa_family = it->ifa_addr->sa_family;
elt = Fcons (conv_sockaddr_to_lisp (it->ifa_netmask, len), elt);
/* There is an it->ifa_broadaddr field, but its contents are
unreliable, so always calculate the broadcast address from
{
for (lres = res; lres; lres = lres->ai_next)
{
-#ifndef AF_INET6
- if (lres->ai_family != AF_INET)
- continue;
+ /* Avoid converting non-IP addresses (Bug#74907). */
+ if (lres->ai_family == AF_INET
+#ifdef AF_INET6
+ || lres->ai_family == AF_INET6
#endif
- addresses = Fcons (conv_sockaddr_to_lisp (lres->ai_addr,
- lres->ai_addrlen),
- addresses);
+ )
+ addresses = Fcons (conv_sockaddr_to_lisp (lres->ai_addr,
+ lres->ai_addrlen),
+ addresses);
+ else
+ continue;
}
addresses = Fnreverse (addresses);
;; End of tests requiring DNS
+(ert-deftest process-tests-check-bug-74907 ()
+ "Check that the result of `network-interface-list' is well-formed.
+(Bug#74907)"
+ (dolist (info (network-interface-list t))
+ (should (stringp (car info)))
+ (should (length= info 4))
+ (should (cl-every #'vectorp (cdr info)))
+ (let ((alen (length (cadr info))))
+ (should (memq alen '(5 9))) ; Address info also has a port number
+ (should (cl-every (lambda (elt) (length= elt alen)) (cdr info))))))
+
(defmacro process-tests--ignore-EMFILE (&rest body)
"Evaluate BODY, ignoring EMFILE errors."
(declare (indent 0) (debug t))