X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fstatd.c;h=01fdb41301889bf6f36d6d68d5cc4d6b51673b33;hp=72c9b41bd4c44c2fd3f632dda89ff0bf6d640dde;hb=9a5293a10551c03b4fb976503dd24da569fcadb3;hpb=99979a6cf2f862d2365d27fa90fab4416c374903 diff --git a/utils/statd/statd.c b/utils/statd/statd.c index 72c9b41..01fdb41 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -75,11 +75,8 @@ 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 (sin->sin_family == AF_INET && - !check_default("statd", sin, rqstp->rq_proc, SM_PROG)) { + if (!check_default("statd", nfs_getrpccaller(transp), SM_PROG)) { svcerr_auth (transp, AUTH_FAILED); return; } @@ -90,13 +87,18 @@ sm_prog_1_wrapper (struct svc_req *rqstp, register SVCXPRT *transp) #define sm_prog_1 sm_prog_1_wrapper #endif +static void +statd_unregister(void) { + nfs_svc_unregister(SM_PROG, SM_VERS); +} + /* * Signal handler. */ static void killer (int sig) { - pmap_unset (SM_PROG, SM_VERS); + statd_unregister (); xlog_err ("Caught signal %d, un-registering and exiting", sig); } @@ -125,6 +127,9 @@ static void log_modes(void) strcat(buf,"No-Daemon "); if (run_mode & MODE_LOG_STDERR) strcat(buf,"Log-STDERR "); +#ifdef HAVE_LIBTIRPC + strcat(buf, "TI-RPC "); +#endif xlog_warn(buf); } @@ -424,10 +429,29 @@ int main (int argc, char **argv) xlog(D_GENERAL, "Local NSM state number: %d", MY_STATE); nsm_update_kernel_state(MY_STATE); - pmap_unset (SM_PROG, SM_VERS); + /* + * ORDER + * Clear old listeners while still root, to override any + * permission checking done by rpcbind. + */ + statd_unregister(); - /* this registers both UDP and TCP services */ - rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port); + /* + * ORDER + */ + if (!nsm_drop_privileges(pidfd)) + exit(1); + + /* + * ORDER + * Create RPC listeners after dropping privileges. This permits + * statd to unregister its own listeners when it exits. + */ + if (nfs_svc_create("statd", SM_PROG, SM_VERS, sm_prog_1, port) == 0) { + xlog(L_ERROR, "failed to create RPC listeners, exiting"); + exit(1); + } + atexit(statd_unregister); /* If we got this far, we have successfully started, so notify parent */ if (pipefds[1] > 0) { @@ -440,9 +464,6 @@ int main (int argc, char **argv) pipefds[1] = -1; } - if (!nsm_drop_privileges(pidfd)) - exit(1); - for (;;) { /* * Handle incoming requests: SM_NOTIFY socket requests, as