connect: on linux, enable reporting of all ICMP errors on UDP sockets

The linux kernel does not report all ICMP errors back to userspace due
to historical reasons.

IP*_RECVERR sockopt must be turned on to have the correct behaviour
which is to pass all ICMP errors to userspace.

See https://bugzilla.kernel.org/show_bug.cgi?id=202355

Closes #6341
This commit is contained in:
Cristian Rodríguez 2020-12-17 11:27:03 -03:00 коммит произвёл Daniel Stenberg
Родитель a7696c7343
Коммит d13179db3e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
1 изменённых файлов: 14 добавлений и 0 удалений

Просмотреть файл

@ -1574,6 +1574,20 @@ CURLcode Curl_socket(struct connectdata *conn,
}
#endif
#if defined(__linux__) && defined(IP_RECVERR)
if(addr->socktype == SOCK_DGRAM) {
int one = 1;
switch(addr->family) {
case AF_INET:
setsockopt(*sockfd, SOL_IP, IP_RECVERR, &one, sizeof(one));
break;
case AF_INET6:
setsockopt(*sockfd, SOL_IPV6, IPV6_RECVERR, &one, sizeof(one));
break;
}
}
#endif
return CURLE_OK;
}