unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#23068: 25.1.50; unix socket address in abstract namespace
@ 2016-03-20  3:18 Mark Oteiza
  2016-03-20 16:32 ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Oteiza @ 2016-03-20  3:18 UTC (permalink / raw)
  To: 23068


For the wishlist: teach emacs how to handle unix domain sockets with
an abstract address.  For instance, connecting to an abstract address
might look like:

  (make-network-process
   :name "dog" :buffer " *woof*"
   :service "\0sock" :family 'local)

the salient part being that the first element of the address is a null
byte. unix(7) has details.

In GNU Emacs 25.1.50.1 (x86_64-unknown-linux-gnu, X toolkit, Xaw scroll bars)
 of 2016-03-19 built on duoteque
Repository revision: 326fff41fa9f674d80be00b5c97c44f8043bbace
Configured using:
 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
 --localstatedir=/var --without-gconf --with-modules
 --with-x-toolkit=lucid 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe
 -fstack-protector-strong --param=ssp-buffer-size=4 -g
 -fvar-tracking-assignments -g -fvar-tracking-assignments'
 CPPFLAGS=-D_FORTIFY_SOURCE=2
 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS
LUCID X11 MODULES






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20  3:18 bug#23068: 25.1.50; unix socket address in abstract namespace Mark Oteiza
@ 2016-03-20 16:32 ` Eli Zaretskii
  2016-03-20 17:02   ` Mark Oteiza
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2016-03-20 16:32 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: 23068

> From: Mark Oteiza <mvoteiza@udel.edu>
> Date: Sat, 19 Mar 2016 23:18:35 -0400
> 
> For the wishlist: teach emacs how to handle unix domain sockets with
> an abstract address.  For instance, connecting to an abstract address
> might look like:
> 
>   (make-network-process
>    :name "dog" :buffer " *woof*"
>    :service "\0sock" :family 'local)
> 
> the salient part being that the first element of the address is a null
> byte. unix(7) has details.

Which parts of this don't already work?





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 16:32 ` Eli Zaretskii
@ 2016-03-20 17:02   ` Mark Oteiza
  2016-03-20 17:11     ` Lars Magne Ingebrigtsen
  0 siblings, 1 reply; 9+ messages in thread
From: Mark Oteiza @ 2016-03-20 17:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 23068

On 20/03/16 at 06:32pm, Eli Zaretskii wrote:
> > From: Mark Oteiza <mvoteiza@udel.edu>
> > Date: Sat, 19 Mar 2016 23:18:35 -0400
> > 
> > For the wishlist: teach emacs how to handle unix domain sockets with
> > an abstract address.  For instance, connecting to an abstract address
> > might look like:
> > 
> >   (make-network-process
> >    :name "dog" :buffer " *woof*"
> >    :service "\0sock" :family 'local)
> > 
> > the salient part being that the first element of the address is a null
> > byte. unix(7) has details.
> 
> Which parts of this don't already work?

For testing purposes, the socket is bound with

  socat -vd abstract-listen:sock,fork TCP:host:port

and I'm able to connect to it otherwise. The above elisp does:

  socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 8
  connect(8, {sa_family=AF_LOCAL, sun_path=@""}, 110) = -1 ECONNREFUSED (Connection refused)
  close(8) 







^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 17:02   ` Mark Oteiza
@ 2016-03-20 17:11     ` Lars Magne Ingebrigtsen
  2016-03-20 17:25       ` Eli Zaretskii
  2016-03-20 17:39       ` Andreas Schwab
  0 siblings, 2 replies; 9+ messages in thread
From: Lars Magne Ingebrigtsen @ 2016-03-20 17:11 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: 23068

Mark Oteiza <mvoteiza@udel.edu> writes:

> and I'm able to connect to it otherwise. The above elisp does:
>
>   socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 8
>   connect(8, {sa_family=AF_LOCAL, sun_path=@""}, 110) = -1
> ECONNREFUSED (Connection refused)
>   close(8) 

Yeah, this code in conv_lisp_to_sockaddr doesn't look very correct:

  else if (STRINGP (address))
    {
#ifdef HAVE_LOCAL_SOCKETS
      if (family == AF_LOCAL)
	{
	  struct sockaddr_un *sockun = (struct sockaddr_un *) sa;
	  cp = SDATA (address);
	  for (i = 0; i < sizeof (sockun->sun_path) && *cp; i++)
	    sockun->sun_path[i] = *cp++;
	  sa->sa_family = family;
	}
#endif
      return;
    }


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 17:11     ` Lars Magne Ingebrigtsen
@ 2016-03-20 17:25       ` Eli Zaretskii
  2016-03-20 17:39       ` Andreas Schwab
  1 sibling, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2016-03-20 17:25 UTC (permalink / raw)
  To: Lars Magne Ingebrigtsen; +Cc: mvoteiza, 23068

> From: Lars Magne Ingebrigtsen <larsi@gnus.org>
> Cc: Eli Zaretskii <eliz@gnu.org>,  23068@debbugs.gnu.org
> Date: Sun, 20 Mar 2016 18:11:09 +0100
> 
> Mark Oteiza <mvoteiza@udel.edu> writes:
> 
> > and I'm able to connect to it otherwise. The above elisp does:
> >
> >   socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 8
> >   connect(8, {sa_family=AF_LOCAL, sun_path=@""}, 110) = -1
> > ECONNREFUSED (Connection refused)
> >   close(8) 
> 
> Yeah, this code in conv_lisp_to_sockaddr doesn't look very correct:
> 
>   else if (STRINGP (address))
>     {
> #ifdef HAVE_LOCAL_SOCKETS
>       if (family == AF_LOCAL)
> 	{
> 	  struct sockaddr_un *sockun = (struct sockaddr_un *) sa;
> 	  cp = SDATA (address);
> 	  for (i = 0; i < sizeof (sockun->sun_path) && *cp; i++)
> 	    sockun->sun_path[i] = *cp++;
> 	  sa->sa_family = family;
> 	}
> #endif
>       return;
>     }

That should be trivial to fix.  Elsewhere, we specifically attempt to
support this feature:

  #ifdef HAVE_LOCAL_SOCKETS
      case AF_LOCAL:
	{
	  struct sockaddr_un *sockun = (struct sockaddr_un *) sa;
	  ptrdiff_t name_length = len - offsetof (struct sockaddr_un, sun_path);
	  /* If the first byte is NUL, the name is a Linux abstract
	     socket name, and the name can contain embedded NULs.  If
	     it's not, we have a NUL-terminated string.  Be careful not
	     to walk past the end of the object looking for the name
	     terminator, however.  */
	  if (name_length > 0 && sockun->sun_path[0] != '\0')
	    {
	      const char *terminator
		= memchr (sockun->sun_path, '\0', name_length);

	      if (terminator)
		name_length = terminator - (const char *) sockun->sun_path;
	    }

	  return make_unibyte_string (sockun->sun_path, name_length);
	}

IOW, this is not a wishlist feature request, but a routine bug report ;-)





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 17:11     ` Lars Magne Ingebrigtsen
  2016-03-20 17:25       ` Eli Zaretskii
@ 2016-03-20 17:39       ` Andreas Schwab
  2016-03-20 18:02         ` Eli Zaretskii
  1 sibling, 1 reply; 9+ messages in thread
From: Andreas Schwab @ 2016-03-20 17:39 UTC (permalink / raw)
  To: Lars Magne Ingebrigtsen; +Cc: Mark Oteiza, 23068

Lars Magne Ingebrigtsen <larsi@gnus.org> writes:

> Mark Oteiza <mvoteiza@udel.edu> writes:
>
>> and I'm able to connect to it otherwise. The above elisp does:
>>
>>   socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 8
>>   connect(8, {sa_family=AF_LOCAL, sun_path=@""}, 110) = -1
>> ECONNREFUSED (Connection refused)
>>   close(8) 
>
> Yeah, this code in conv_lisp_to_sockaddr doesn't look very correct:
>
>   else if (STRINGP (address))
>     {
> #ifdef HAVE_LOCAL_SOCKETS
>       if (family == AF_LOCAL)
> 	{
> 	  struct sockaddr_un *sockun = (struct sockaddr_un *) sa;
> 	  cp = SDATA (address);
> 	  for (i = 0; i < sizeof (sockun->sun_path) && *cp; i++)
> 	    sockun->sun_path[i] = *cp++;

This also needs to encode the string in one way.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 17:39       ` Andreas Schwab
@ 2016-03-20 18:02         ` Eli Zaretskii
  2016-03-20 19:49           ` Andreas Schwab
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2016-03-20 18:02 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: mvoteiza, larsi, 23068

> From: Andreas Schwab <schwab@linux-m68k.org>
> Date: Sun, 20 Mar 2016 18:39:02 +0100
> Cc: Mark Oteiza <mvoteiza@udel.edu>, 23068@debbugs.gnu.org
> 
> This also needs to encode the string in one way.

The network-related functions in process.c generally don't bother
encoding the strings at all.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 18:02         ` Eli Zaretskii
@ 2016-03-20 19:49           ` Andreas Schwab
  2016-03-20 19:51             ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Andreas Schwab @ 2016-03-20 19:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mvoteiza, larsi, 23068

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Andreas Schwab <schwab@linux-m68k.org>
>> Date: Sun, 20 Mar 2016 18:39:02 +0100
>> Cc: Mark Oteiza <mvoteiza@udel.edu>, 23068@debbugs.gnu.org
>> 
>> This also needs to encode the string in one way.
>
> The network-related functions in process.c generally don't bother
> encoding the strings at all.

That doesn't mean it is correct.  A file name needs to be encoded.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#23068: 25.1.50; unix socket address in abstract namespace
  2016-03-20 19:49           ` Andreas Schwab
@ 2016-03-20 19:51             ` Eli Zaretskii
  0 siblings, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2016-03-20 19:51 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: mvoteiza, larsi, 23068

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: mvoteiza@udel.edu,  larsi@gnus.org,  23068@debbugs.gnu.org
> Date: Sun, 20 Mar 2016 20:49:31 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Andreas Schwab <schwab@linux-m68k.org>
> >> Date: Sun, 20 Mar 2016 18:39:02 +0100
> >> Cc: Mark Oteiza <mvoteiza@udel.edu>, 23068@debbugs.gnu.org
> >> 
> >> This also needs to encode the string in one way.
> >
> > The network-related functions in process.c generally don't bother
> > encoding the strings at all.
> 
> That doesn't mean it is correct.

No, of course not.  What it means is that many more places need to be
fixed in this regard.





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-03-20 19:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-20  3:18 bug#23068: 25.1.50; unix socket address in abstract namespace Mark Oteiza
2016-03-20 16:32 ` Eli Zaretskii
2016-03-20 17:02   ` Mark Oteiza
2016-03-20 17:11     ` Lars Magne Ingebrigtsen
2016-03-20 17:25       ` Eli Zaretskii
2016-03-20 17:39       ` Andreas Schwab
2016-03-20 18:02         ` Eli Zaretskii
2016-03-20 19:49           ` Andreas Schwab
2016-03-20 19:51             ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).