X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fsm-notify.c;h=928d1c56f03bff687ec90adef071d78a0313720b;hp=0ba817a431a225cab45ab083d62688780b449af5;hb=86cfdf1d38da18f9f917c674daba79a4435445a7;hpb=f867499c8521a957776d52a9657b15fa7c2a513f diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c index 0ba817a..928d1c5 100644 --- a/utils/statd/sm-notify.c +++ b/utils/statd/sm-notify.c @@ -215,6 +215,26 @@ static int smn_socket(void) } #endif /* !IPV6_SUPPORTED */ +#ifdef HAVE_LIBTIRPC +static int +smn_bindresvport(int sock, struct sockaddr *sap) +{ + return bindresvport_sa(sock, sap); +} + +#else /* !HAVE_LIBTIRPC */ +static int +smn_bindresvport(int sock, struct sockaddr *sap) +{ + if (sap->sa_family != AF_INET) { + errno = EAFNOSUPPORT; + return -1; + } + + return bindresvport(sock, (struct sockaddr_in *)(char *)sap); +} +#endif /* !HAVE_LIBTIRPC */ + /* * Prepare a socket for sending RPC requests * @@ -265,7 +285,14 @@ retry: } else { struct servent *se; struct sockaddr_in *sin = (struct sockaddr_in *)local_addr; - (void) bindresvport(sock, sin); + + if (smn_bindresvport(sock, local_addr) == -1) { + xlog(L_ERROR, + "bindresvport on RPC socket failed: %m"); + (void)close(sock); + return -1; + } + /* try to avoid known ports */ se = getservbyport(sin->sin_port, "udp"); if (se && retry_cnt < 100) {