diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2009-03-05 06:20:40 -0500 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2009-03-05 06:20:40 -0500 |
commit | 27a49079b03316eebcbc74197b73988b01b58ecc (patch) | |
tree | f24ddd9ce2c3d2cb9cc508c9ce27ae966c79dc91 /utils/statd | |
parent | 5529fdbb4acb2507b79acf07e08c2a88c1df9e38 (diff) | |
download | nfs-utils-27a49079b03316eebcbc74197b73988b01b58ecc.tar.gz nfs-utils-27a49079b03316eebcbc74197b73988b01b58ecc.tar.xz nfs-utils-27a49079b03316eebcbc74197b73988b01b58ecc.zip |
nfs-utils: Provide type-checked version of svc_getcaller()
TI-RPC's version of the svc_getcaller() macro points to a sockaddr_in6,
not a sockaddr_in, though for AF_INET callers, an AF_INET address
resides there. To squelch compiler warnings when the TI-RPC version of
the svc_req structure is used, add inline helpers with appropriate
type casting.
Note that tcp_wrappers support only AF_INET addresses for now.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/statd')
-rw-r--r-- | utils/statd/callback.c | 9 | ||||
-rw-r--r-- | utils/statd/monitor.c | 5 | ||||
-rw-r--r-- | utils/statd/simu.c | 12 | ||||
-rw-r--r-- | utils/statd/statd.c | 6 |
4 files changed, 24 insertions, 8 deletions
diff --git a/utils/statd/callback.c b/utils/statd/callback.c index 505fdb3..8885238 100644 --- a/utils/statd/callback.c +++ b/utils/statd/callback.c @@ -9,10 +9,13 @@ #ifdef HAVE_CONFIG_H #include <config.h> #endif + +#include <arpa/inet.h> + +#include "rpcmisc.h" #include "misc.h" #include "statd.h" #include "notlist.h" -#include <arpa/inet.h> /* Callback notify list. */ /* notify_list *cbnl = NULL; ... never used */ @@ -29,8 +32,8 @@ sm_notify_1_svc(struct stat_chge *argp, struct svc_req *rqstp) { notify_list *lp, *call; static char *result = NULL; - char *ip_addr = xstrdup(inet_ntoa(svc_getcaller(rqstp->rq_xprt) - ->sin_addr)); + struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); + char *ip_addr = xstrdup(inet_ntoa(sin->sin_addr)); dprintf(N_DEBUG, "Received SM_NOTIFY from %s, state: %d", argp->mon_name, argp->state); diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c index 24c2531..169cd78 100644 --- a/utils/statd/monitor.c +++ b/utils/statd/monitor.c @@ -20,6 +20,8 @@ #include <errno.h> #include <arpa/inet.h> #include <dirent.h> + +#include "rpcmisc.h" #include "misc.h" #include "statd.h" #include "notlist.h" @@ -36,9 +38,10 @@ notify_list * rtnl = NULL; /* Run-time notify list. */ static int caller_is_localhost(struct svc_req *rqstp) { + struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); struct in_addr caller; - caller = svc_getcaller(rqstp->rq_xprt)->sin_addr; + caller = sin->sin_addr; if (caller.s_addr != htonl(INADDR_LOOPBACK)) { note(N_WARNING, "Call to statd from non-local host %s", diff --git a/utils/statd/simu.c b/utils/statd/simu.c index 25e8bad..a7ecb85 100644 --- a/utils/statd/simu.c +++ b/utils/statd/simu.c @@ -7,8 +7,10 @@ #ifdef HAVE_CONFIG_H #include <config.h> #endif + #include <arpa/inet.h> +#include "rpcmisc.h" #include "statd.h" #include "notlist.h" @@ -21,17 +23,23 @@ extern void my_svc_exit (void); void * sm_simu_crash_1_svc (void *argp, struct svc_req *rqstp) { + struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); static char *result = NULL; struct in_addr caller; - caller = svc_getcaller(rqstp->rq_xprt)->sin_addr; + if (sin->sin_family != AF_INET) { + note(N_WARNING, "Call to statd from non-AF_INET address"); + goto failure; + } + + caller = sin->sin_addr; if (caller.s_addr != htonl(INADDR_LOOPBACK)) { note(N_WARNING, "Call to statd from non-local host %s", inet_ntoa(caller)); goto failure; } - if (ntohs(svc_getcaller(rqstp->rq_xprt)->sin_port) >= 1024) { + if (ntohs(sin->sin_port) >= 1024) { note(N_WARNING, "Call to statd-simu-crash from unprivileged port"); goto failure; } diff --git a/utils/statd/statd.c b/utils/statd/statd.c index 321f7a9..6da2ab2 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -88,9 +88,11 @@ extern void simulator (int, char **); static void sm_prog_1_wrapper (struct svc_req *rqstp, register SVCXPRT *transp) { + struct sockaddr_in *sin = nfs_getrpccaller_in(transp); + /* remote host authorization check */ - if (!check_default("statd", svc_getcaller(transp), - rqstp->rq_proc, SM_PROG)) { + if (sin->sin_family == AF_INET && + !check_default("statd", sin, rqstp->rq_proc, SM_PROG)) { svcerr_auth (transp, AUTH_FAILED); return; } |