svn commit: r191742 - head/sys/compat/linux

Robert Watson rwatson at FreeBSD.org
Sun May 3 03:57:04 UTC 2009


On Sat, 2 May 2009, Dmitry Chagin wrote:

>  Linux socketpair() call expects explicit specified protocol for
>  AF_LOCAL domain unlike FreeBSD which expects 0 in this case.
...
> @@ -859,7 +859,10 @@ linux_socketpair(struct thread *td, stru
> 		return (EINVAL);
>
> 	bsd_args.type = args->type;
> -	bsd_args.protocol = args->protocol;
> +	if (bsd_args.domain == AF_LOCAL && args->protocol == PF_UNIX)
> +		bsd_args.protocol = 0;
> +	else
> +		bsd_args.protocol = args->protocol;
> 	bsd_args.rsv = (int *)PTRIN(args->rsv);
> 	return (socketpair(td, &bsd_args));
> }

I think I'd tweak this to be more like:

 	if (bsd_args.domain == PF_LOCAL) {
 		if (bsd_args.protocol == PF_UNIX)
 			bsd_args.protocl = 0;
 		else if (bsd_args.protocol != 0)
 			return (EPROTONOSUPPORT);
 	}

Because (a) the domain argument takes a protocol family in FreeBSD and you're 
passing arguments into the BSD ABI without a mapping for that field, and (b) 
for the protocol family the use of PF_UNIX is weird but must be supported, so 
I'd consider it to be an entirely mapped namespace and avoid passing through 
values that aren't 0 to the BSD layer as it's not clear what that would mean.

Robert N M Watson
Computer Laboratory
University of Cambridge


More information about the svn-src-all mailing list