> On 15 Jan 2023, at 13:50, Alexander V. Chernikov <melif...@ipfw.ru> wrote:
>
>
>
>> On 14 Jan 2023, at 20:46, Guy Yur <guy...@gmail.com> wrote:
>>
>> Hi,
>>
>> close(2) on a PF_ROUTE socket returns -1 and sets errno to EOPNOTSUPP.
>> I am testing 14.0-CURRENT (main branch) built today.
>> On 13.1-RELEASE-p5 close returns 0.
>>
>> The problem looks to be related to 36b10ac2cd18a535cac20ccf51e3fc6c408671e8.
>>
>> The commit removed rts_disconnect and initialization for .pru_disconnect.
>> After the change, .pr_disconnect is not initialized in rtsock.c
>> so now it is set to pr_disconnect_notsupp.
>> This causes flow of:
>> soclose()
>> sodisconnect()
>> so->so_proto->pr_disconnect()
>> pr_disconnect_notsupp()
>> return EOPNOTSUPP
>> On 13.1 it called the raw socket disconnect which returned ENOTCONN.
>>
>> Noticed in dhcpcd error: if_route (ADD): Operation not supported
>> dhcpcd with privsep called write() which failed with EEXIST (expected since
>> route already existed) and then close() which overwrote the errno to
>> EOPNOTSUPP and the parent process received back EOPNOTSUPP instead of EEXIST.
> Thank you for the report!
> I’ve created https://reviews.freebsd.org/D38059 to address the issue.
Landed in 42904794b804.
>>
>>
>>
>> Simple test program (prints error on head, no error on 13.1):
>>
>> #include <sys/types.h>
>> #include <sys/time.h>
>> #include <sys/socket.h>
>> #include <net/if.h>
>> #include <net/route.h>
>> #include <unistd.h>
>> #include <err.h>
>>
>> int main(int argc, char *argv[])
>> {
>> int s = socket(PF_ROUTE, SOCK_RAW, 0);
>> if (s == -1)
>> err(1, "socket()");
>> if (close(s) == -1)
>> err(1, "close()");
>> return 0;
>> }
>>
>>
>> Regards,
>> Guy Yur