diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2009-03-18 20:47:14 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-03-28 15:56:04 -0400 |
commit | 126e4bc3b3b446482696377f67a634c76eaf2e9c (patch) | |
tree | baa96bad06505f212e59b7e1fa557658412979c8 | |
parent | 3aba45536fe8f92aa07bcdfd2fb1cf17eec7d786 (diff) |
SUNRPC: rpcbind actually interprets r_owner string
RFC 1833 has little to say about the contents of r_owner; it only
specifies that it is a string, and states that it is used to control
who can UNSET an entry.
Our port of rpcbind (from Sun) assumes this string contains a numeric
UID value, not alphabetical or symbolic characters, but checks this
value only for AF_LOCAL RPCB_SET or RPCB_UNSET requests. In all other
cases, rpcbind ignores the contents of the r_owner string.
The reference user space implementation of rpcb_set(3) uses a numeric
UID for all SET/UNSET requests (even via the network) and an empty
string for all other requests. We emulate that behavior here to
maintain bug-for-bug compatibility.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 44d0732ba874..d550d0b967db 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -63,9 +63,16 @@ enum { | |||
63 | * r_owner | 63 | * r_owner |
64 | * | 64 | * |
65 | * The "owner" is allowed to unset a service in the rpcbind database. | 65 | * The "owner" is allowed to unset a service in the rpcbind database. |
66 | * We always use the following (arbitrary) fixed string. | 66 | * |
67 | * For AF_LOCAL SET/UNSET requests, rpcbind treats this string as a | ||
68 | * UID which it maps to a local user name via a password lookup. | ||
69 | * In all other cases it is ignored. | ||
70 | * | ||
71 | * For SET/UNSET requests, user space provides a value, even for | ||
72 | * network requests, and GETADDR uses an empty string. We follow | ||
73 | * those precedents here. | ||
67 | */ | 74 | */ |
68 | #define RPCB_OWNER_STRING "rpcb" | 75 | #define RPCB_OWNER_STRING "0" |
69 | #define RPCB_MAXOWNERLEN sizeof(RPCB_OWNER_STRING) | 76 | #define RPCB_MAXOWNERLEN sizeof(RPCB_OWNER_STRING) |
70 | 77 | ||
71 | static void rpcb_getport_done(struct rpc_task *, void *); | 78 | static void rpcb_getport_done(struct rpc_task *, void *); |
@@ -566,7 +573,7 @@ void rpcb_getport_async(struct rpc_task *task) | |||
566 | map->r_xprt = xprt_get(xprt); | 573 | map->r_xprt = xprt_get(xprt); |
567 | map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID); | 574 | map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID); |
568 | map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR); | 575 | map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR); |
569 | map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */ | 576 | map->r_owner = ""; |
570 | map->r_status = -EIO; | 577 | map->r_status = -EIO; |
571 | 578 | ||
572 | child = rpcb_call_async(rpcb_clnt, map, proc); | 579 | child = rpcb_call_async(rpcb_clnt, map, proc); |