The condition in 620 currently is (see if()):
ia = in_get_ia_psref(ip->ip_src, &psref_ia);
/* Ensure we only send from a valid address. */==>
if ((ia != NULL || (flags & IP_FORWARDING) == 0) && <<<<!
(error = ip_ifaddrvalid(ia)) != 0)
{
ARPLOG(LOG_ERR,
"refusing to send from invalid address %s (pid %d)\n",
ARPLOGADDR(ip->ip_src), curproc->p_pid);
IP_STATINC(IP_STAT_ODROPPED);
if (error == 1)
/*
* Address exists, but is tentative or detached.
* We can't send from it because it's invalid,
* so we drop the packet.
*/
error = 0;
else
error = EADDRNOTAVAIL;
goto bad;
}
Proposed fix is to replace the || inf the if with && as this also seems
to have been the original intention by the author.