php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #16121 fsockopen can't handle unix sockets created in abstract namespace
Submitted: 2002-03-16 21:56 UTC Modified: 2002-03-20 17:59 UTC
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: mathias at taschenorakel dot de Assigned: wez
Status: Closed Package: Sockets related
PHP Version: 4.0.6 OS: any
Private report: No CVE-ID:
 [2002-03-16 21:56 UTC] mathias at taschenorakel dot de
fsockopen can't handle unix sockets created in abstract namespace (unix sockets with the associated pathname starting with '\0'; see UNIX(4) of the 'Linux Programmer's Manual' for details).

This bug is 'caused since the implementation of fsockopen in PHP 4.0.6 uses strlcpy to copy from $hostname to  unix_addr.sun_path without looking at the first byte of $hostname (fsock.c, line 240). One possible solution would be to change line 240 from

strlcpy(unix_addr.sun_path, (*args[0])->value.str.val,
        sizeof(unix_addr.sun_path));

to

pathofs = ((*args[0])->value.str.val[0] ? 0 : 1);
strlcpy(unix_addr.sun_path + pathofs, 
        (*args[0])->value.str.val + pathofs,
        sizeof(unix_addr.sun_path) - pathofs);

where pathofs would be of type "size_t".

Another solution avoiding the ugly '\0' byte would be to introduce separate scheme prefixes like "file:" and "abstract:" for UNIX domain sockets.

Ciao,
Mathias

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-03-17 07:34 UTC] wez@php.net
My man page for unix sockets says this:

If  sun_path  starts  with  a  zero  byte it refers to the
abstract namespace maintained by the Unix protocol module.
The  socket's  address  in  this namespace is given by the
rest of the bytes in sun_path.  Note  that  names  in  the
abstract namespace are not zero-terminated.

I'll integrate something that can handle this into the new
streams architecture; you might not be able to do this in
the PHP 4.2, but the release after will have it.

Do you know if this is linux-only or do other platforms
support it?


 [2002-03-20 15:21 UTC] mathias at taschenorakel dot de
Great, that you are going to integrate something like that. Yes, unfortunatly this feature appears to be linux-only :-/ ('ve read man pages and wrote test code on SunOS 5.8, IRIX 3, FreeBSD 4.3 and MacOS X 10.1).

Nevertheless it's a cool feature since Linux removes abdoned Unix sockets of the abstract namespace automatically -- you don't have to take care about removing Unix sockets, don't need clever code to figure out weither a unix socket file belongs to a vital daemon or just is left over...
 [2002-03-20 17:59 UTC] wez@php.net
The new streams architecture now supports this; you can
try it out using a recent snap of CVS.
It won't be in PHP 4.2, but if you are happy making the
change you describe below to your local source, you
should be sorted.
I'm closing this; if you manage to test CVS and find it has
a problem, re-open this report.
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 17 12:01:59 2014 UTC