Re: close(2) on a PF_ROUTE socket returns -1 and sets errno to EOPNOTSUPP

2023-01-16 Thread Alexander V. Chernikov


> On 15 Jan 2023, at 13:50, Alexander V. Chernikov  wrote:
> 
> 
> 
>> On 14 Jan 2023, at 20:46, Guy Yur  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 
>> #include 
>> #include 
>> #include 
>> #include 
>> #include 
>> #include 
>> 
>> 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





Re: close(2) on a PF_ROUTE socket returns -1 and sets errno to EOPNOTSUPP

2023-01-15 Thread Alexander V. Chernikov



> On 14 Jan 2023, at 20:46, Guy Yur  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.
> 
> 
> 
> Simple test program (prints error on head, no error on 13.1):
> 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> 
> 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




close(2) on a PF_ROUTE socket returns -1 and sets errno to EOPNOTSUPP

2023-01-14 Thread Guy Yur
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.

Simple test program (prints error on head, no error on 13.1):

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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