[erlang-questions] unix domain sockets with abstract namespace: can't use all 108 bytes

Raimo Niskanen raimo+erlang-questions@REDACTED
Fri May 19 14:49:18 CEST 2017


On Fri, May 12, 2017 at 03:05:20PM +0200, Raimo Niskanen wrote:
> On Thu, May 11, 2017 at 05:02:54PM +0200, Raimo Niskanen wrote:
> > On Tue, May 02, 2017 at 01:33:45PM +0200, Raimo Niskanen wrote:
> > > On Tue, May 02, 2017 at 09:44:35AM +1200, Richard A. O'Keefe wrote:
> > > > 
> > > > > On 29/04/2017, at 12:28 AM, Raimo Niskanen <raimo+erlang-questions@REDACTED> wrote:
> > > > > 
> > > > > It is difficult to reliably detect the other direction i.e in the driver
> > > > > when you get an address from e.g getsockname(); is it an empty string or an
> > > > > abstract address?
> > > > 
> > > > Surely an empty string would never have been legal,
> > > > so if the first byte is NUL and the host supports abstract
> > > > addresses, it must be an abstract address?
> > > > 
> > > 
> > > If the first byte is NUL and the length is larger than 0 then it must be an
> > > abstract address.  But when this comes from above (from Erlang) and since
> > > we do not know if the host supports abstract addresses; if we give
> > > the kernel a first byte NUL but address length longer than SUN_LEN(su),
> > > will then we cause harm on some OS?
> > > 
> > > I will assume not and rewrite the code, soonish...
> > 
> > I now have a solution that looks at .sun_len if it exists, otherwise trusts
> > the leading zero.
> 
> I was wrong.  .sun_len says the same as the argument size parameter so that
> was a dead end.
> > 
> > That works on all platforms but Solaris since it has no .sun_len and when
> > I get an address from e.g getsockname() on an unbound socket it is all 0's
> > and the *lenght parameter from getsockname() is unaltered, so that has to
> > be translated to 108 zeros.  My code on all other platforms (OpenBSD,
> > FreeBSD, Linux, Mac OS X) detect this as a zero length address...
> > 
> > I need a way to fix this on Solaris!
> 
> Now also on FreeBSD and OpenBSD...
> 
> > 
> > Any ideas?

I had to resort to checking for the preprocessor constant __linux__ as an
indication of whether AF_UNIX supports Abstract Addresses.

I feel unclean, but the problem seems to be solved.

Coming in OTP-20.0-rc2.

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB



More information about the erlang-questions mailing list