SUNRPC: support abstract unix socket addresses
authorNeilBrown <neilb@suse.de>
Wed, 10 May 2023 22:06:24 +0000 (08:06 +1000)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 19 Jun 2023 16:12:22 +0000 (12:12 -0400)
An "abtract" address for an AF_UNIX socket start with a nul and can
contain any bytes for the given length, but traditionally doesn't
contain other nuls.  When reported, the leading nul is replaced by '@'.

sunrpc currently rejects connections to these addresses and reports them
as an empty string.  To provide support for future use of these
addresses, allow them for outgoing connections and report them more
usefully.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/clnt.c
net/sunrpc/xprtsock.c

index d2ee5663430830e8b867ac9ee118779d777a89e9..18f70854f528521bbc9d83167a18b88a5a2eb129 100644 (file)
@@ -565,8 +565,12 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
                servername[0] = '\0';
                switch (args->address->sa_family) {
                case AF_LOCAL:
-                       snprintf(servername, sizeof(servername), "%s",
-                                sun->sun_path);
+                       if (sun->sun_path[0])
+                               snprintf(servername, sizeof(servername), "%s",
+                                        sun->sun_path);
+                       else
+                               snprintf(servername, sizeof(servername), "@%s",
+                                        sun->sun_path+1);
                        break;
                case AF_INET:
                        snprintf(servername, sizeof(servername), "%pI4",
index 5f9030b81c9eab73419742436fd86f29743a0dbe..515328a8dafe1d389bb36aae394dafb5f1ae93cf 100644 (file)
@@ -253,7 +253,12 @@ static void xs_format_common_peer_addresses(struct rpc_xprt *xprt)
        switch (sap->sa_family) {
        case AF_LOCAL:
                sun = xs_addr_un(xprt);
-               strscpy(buf, sun->sun_path, sizeof(buf));
+               if (sun->sun_path[0]) {
+                       strscpy(buf, sun->sun_path, sizeof(buf));
+               } else {
+                       buf[0] = '@';
+                       strscpy(buf+1, sun->sun_path+1, sizeof(buf)-1);
+               }
                xprt->address_strings[RPC_DISPLAY_ADDR] =
                                                kstrdup(buf, GFP_KERNEL);
                break;
@@ -2858,7 +2863,7 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
 
        switch (sun->sun_family) {
        case AF_LOCAL:
-               if (sun->sun_path[0] != '/') {
+               if (sun->sun_path[0] != '/' && sun->sun_path[0] != '\0') {
                        dprintk("RPC:       bad AF_LOCAL address: %s\n",
                                        sun->sun_path);
                        ret = ERR_PTR(-EINVAL);