* sunrpc/pm_getport.c (__get_socket): New function.

(pmap_getport): Use it to open a non-reserved socket to the portmapper
	for TCP.
	* include/rpc/pmap_clnt.h (__get_socket): Declare.
	* sunrpc/pm_getmaps.c (pmap_getmaps): Use __get_socket to get an
	non-reserved socket for the portmapper.

	range to even lower ports.
This commit is contained in:
Ulrich Drepper 2005-05-23 17:14:22 +00:00
parent 3a0cd663c2
commit faf10b955b
4 changed files with 74 additions and 6 deletions

View File

@ -1,8 +1,15 @@
2005-05-23 Ulrich Drepper <drepper@redhat.com> 2005-05-23 Ulrich Drepper <drepper@redhat.com>
* sunrpc/pm_getport.c (__get_socket): New function.
(pmap_getport): Use it to open a non-reserved socket to the portmapper
for TCP.
* include/rpc/pmap_clnt.h (__get_socket): Declare.
* sunrpc/pm_getmaps.c (pmap_getmaps): Use __get_socket to get an
non-reserved socket for the portmapper.
* sunrpc/bindrsvprt.c (bindresvport): Try harder to find a port. * sunrpc/bindrsvprt.c (bindresvport): Try harder to find a port.
If we tried looking at the usual range without success extend the If we tried looking at the usual range without success extend the
range to even lower ports.q range to even lower ports.
* sysdeps/unix/clock_gettime.c (clock_gettime): Revert last patch. * sysdeps/unix/clock_gettime.c (clock_gettime): Revert last patch.

View File

@ -5,4 +5,8 @@ libc_hidden_proto (pmap_getport)
libc_hidden_proto (pmap_set) libc_hidden_proto (pmap_set)
libc_hidden_proto (pmap_unset) libc_hidden_proto (pmap_unset)
/* Defined in pm_getport.c. */
extern int __get_socket (struct sockaddr_in *saddr)
attribute_hidden internal_function;
#endif #endif

View File

@ -44,9 +44,12 @@ static char sccsid[] = "@(#)pmap_getmaps.c 1.10 87/08/11 Copyr 1984 Sun Micro";
#include <rpc/pmap_clnt.h> #include <rpc/pmap_clnt.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> #include <netdb.h>
#include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <libintl.h> #include <libintl.h>
#include <unistd.h>
/* /*
* Get a copy of the current port maps. * Get a copy of the current port maps.
@ -56,13 +59,19 @@ struct pmaplist *
pmap_getmaps (struct sockaddr_in *address) pmap_getmaps (struct sockaddr_in *address)
{ {
struct pmaplist *head = (struct pmaplist *) NULL; struct pmaplist *head = (struct pmaplist *) NULL;
int socket = -1;
struct timeval minutetimeout; struct timeval minutetimeout;
CLIENT *client; CLIENT *client;
bool closeit = false;
minutetimeout.tv_sec = 60; minutetimeout.tv_sec = 60;
minutetimeout.tv_usec = 0; minutetimeout.tv_usec = 0;
address->sin_port = htons (PMAPPORT); address->sin_port = htons (PMAPPORT);
/* Don't need a reserver port to get ports from the portmapper */
int socket = __get_socket (address);
if (socket != -1)
closeit = true;
client = INTUSE(clnttcp_create) (address, PMAPPROG, client = INTUSE(clnttcp_create) (address, PMAPPROG,
PMAPVERS, &socket, 50, 500); PMAPVERS, &socket, 50, 500);
if (client != (CLIENT *) NULL) if (client != (CLIENT *) NULL)
@ -75,7 +84,9 @@ pmap_getmaps (struct sockaddr_in *address)
} }
CLNT_DESTROY (client); CLNT_DESTROY (client);
} }
/* (void)close(socket); CLNT_DESTROY already closed it */ /* We only need to close the socket here if we opened it. */
if (closeit)
(void) __close (socket);
address->sin_port = 0; address->sin_port = 0;
return head; return head;
} }

View File

@ -38,6 +38,8 @@ static char sccsid[] = "@(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro";
* Copyright (C) 1984, Sun Microsystems, Inc. * Copyright (C) 1984, Sun Microsystems, Inc.
*/ */
#include <stdbool.h>
#include <unistd.h>
#include <rpc/rpc.h> #include <rpc/rpc.h>
#include <rpc/pmap_prot.h> #include <rpc/pmap_prot.h>
#include <rpc/pmap_clnt.h> #include <rpc/pmap_clnt.h>
@ -48,6 +50,41 @@ static const struct timeval timeout =
static const struct timeval tottimeout = static const struct timeval tottimeout =
{60, 0}; {60, 0};
/*
* Create a socket that is locally bound to a non-reserve port. For
* any failures, -1 is returned which will cause the RPC code to
* create the socket.
*/
int
internal_function
__get_socket (struct sockaddr_in *saddr)
{
int so = __socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (so < 0)
return -1;
struct sockaddr_in laddr;
socklen_t namelen = sizeof (laddr);
laddr.sin_family = AF_INET;
laddr.sin_port = 0;
laddr.sin_addr.s_addr = htonl (INADDR_ANY);
int cc = __bind (so, (struct sockaddr *) &laddr, namelen);
if (__builtin_expect (cc < 0, 0))
{
fail:
__close (so);
return -1;
}
cc = __connect (so, (struct sockaddr *) saddr, namelen);
if (__builtin_expect (cc < 0, 0))
goto fail;
return so;
}
/* /*
* Find the mapped port for program,version. * Find the mapped port for program,version.
* Calls the pmap service remotely to do the lookup. * Calls the pmap service remotely to do the lookup.
@ -64,11 +101,18 @@ pmap_getport (address, program, version, protocol)
int socket = -1; int socket = -1;
CLIENT *client; CLIENT *client;
struct pmap parms; struct pmap parms;
bool closeit = false;
address->sin_port = htons (PMAPPORT); address->sin_port = htons (PMAPPORT);
if (protocol == IPPROTO_TCP) if (protocol == IPPROTO_TCP)
client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket, {
RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); /* Don't need a reserved port to get ports from the portmapper. */
socket = __get_socket(address);
if (socket != -1)
closeit = true;
client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket,
RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
}
else else
client = INTUSE(clntudp_bufcreate) (address, PMAPPROG, PMAPVERS, timeout, client = INTUSE(clntudp_bufcreate) (address, PMAPPROG, PMAPVERS, timeout,
&socket, RPCSMALLMSGSIZE, &socket, RPCSMALLMSGSIZE,
@ -93,7 +137,9 @@ pmap_getport (address, program, version, protocol)
} }
CLNT_DESTROY (client); CLNT_DESTROY (client);
} }
/* (void)close(socket); CLNT_DESTROY already closed it */ /* We only need to close the socket here if we opened it. */
if (closeit)
(void) __close (socket);
address->sin_port = 0; address->sin_port = 0;
return port; return port;
} }