X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fsimu.c;h=a7ecb85c275509e687c4351955c4c5b4d1e3c03d;hp=78a6ee2e9d6cc059d233b11c4efa8ef9631ff2af;hb=27a49079b03316eebcbc74197b73988b01b58ecc;hpb=430052cab3c8044ef6d1be7b5a5ded13c45d0c40 diff --git a/utils/statd/simu.c b/utils/statd/simu.c index 78a6ee2..a7ecb85 100644 --- a/utils/statd/simu.c +++ b/utils/statd/simu.c @@ -4,7 +4,13 @@ * NSM for Linux. */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "rpcmisc.h" #include "statd.h" #include "notlist.h" @@ -17,7 +23,26 @@ 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; + + 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(sin->sin_port) >= 1024) { + note(N_WARNING, "Call to statd-simu-crash from unprivileged port"); + goto failure; + } note (N_WARNING, "*** SIMULATING CRASH! ***"); my_svc_exit (); @@ -25,5 +50,6 @@ sm_simu_crash_1_svc (void *argp, struct svc_req *rqstp) if (rtnl) nlist_kill (&rtnl); + failure: return ((void *)&result); }