This depends on eglibc being patched as in #638810.

Ben.

--- libtirpc-0.2.2.orig/src/bindresvport.c
+++ libtirpc-0.2.2/src/bindresvport.c
@@ -58,12 +58,8 @@
         return bindresvport_sa(sd, (struct sockaddr *)sin);
 }
 
-#ifdef __linux__
-
-#define STARTPORT 600
-#define LOWPORT 512
-#define ENDPORT (IPPORT_RESERVED - 1)
-#define NPORTS  (ENDPORT - STARTPORT + 1)
+/* We now want to call libc's bindresvport() */
+#undef bindresvport
 
 int
 bindresvport_sa(sd, sa)
@@ -72,17 +68,7 @@
 {
         int res, af;
         struct sockaddr_storage myaddr;
-       struct sockaddr_in *sin;
-#ifdef INET6
-       struct sockaddr_in6 *sin6;
-#endif
-       u_int16_t *portp;
-       static u_int16_t port;
-       static short startport = STARTPORT;
        socklen_t salen;
-       int nports = ENDPORT - startport + 1;
-       int endport = ENDPORT;
-       int i;
 
         if (sa == NULL) {
                 salen = sizeof(myaddr);
@@ -97,140 +83,11 @@
 
         switch (af) {
         case AF_INET:
-               sin = (struct sockaddr_in *)sa;
-                salen = sizeof(struct sockaddr_in);
-                port = ntohs(sin->sin_port);
-               portp = &sin->sin_port;
-               break;
-#ifdef INET6
+                return bindresvport(sd, (struct sockaddr_in *)sa);
         case AF_INET6:
-               sin6 = (struct sockaddr_in6 *)sa;
-                salen = sizeof(struct sockaddr_in6);
-                port = ntohs(sin6->sin6_port);
-                portp = &sin6->sin6_port;
-                break;
-#endif
+                return bindresvport6(sd, (struct sockaddr_in6 *)sa);
         default:
                 errno = EPFNOSUPPORT;
                 return (-1);
         }
-        sa->sa_family = af;
-
-        if (port == 0) {
-                port = (getpid() % NPORTS) + STARTPORT;
-        }
-        res = -1;
-        errno = EADDRINUSE;
-               again:
-        for (i = 0; i < nports; ++i) {
-                *portp = htons(port++);
-                 if (port > endport) 
-                        port = startport;
-                res = bind(sd, sa, salen);
-               if (res >= 0 || errno != EADDRINUSE)
-                       break;
-        }
-       if (i == nports && startport != LOWPORT) {
-           startport = LOWPORT;
-           endport = STARTPORT - 1;
-           nports = STARTPORT - LOWPORT;
-           port = LOWPORT + port % (STARTPORT - LOWPORT);
-           goto again;
-       }
-        return (res);
-}
-#else
-
-#define IP_PORTRANGE 19
-#define IP_PORTRANGE_LOW 2
-
-/*
- * Bind a socket to a privileged IP port
- */
-int
-bindresvport_sa(sd, sa)
-       int sd;
-       struct sockaddr *sa;
-{
-       int old, error, af;
-       struct sockaddr_storage myaddr;
-       struct sockaddr_in *sin;
-#ifdef INET6
-       struct sockaddr_in6 *sin6;
-#endif
-       int proto, portrange, portlow;
-       u_int16_t *portp;
-       socklen_t salen;
-
-       if (sa == NULL) {
-               salen = sizeof(myaddr);
-               sa = (struct sockaddr *)&myaddr;
-
-               if (getsockname(sd, sa, &salen) == -1)
-                       return -1;      /* errno is correctly set */
-
-               af = sa->sa_family;
-               memset(sa, 0, salen);
-       } else
-               af = sa->sa_family;
-
-       switch (af) {
-       case AF_INET:
-               proto = IPPROTO_IP;
-               portrange = IP_PORTRANGE;
-               portlow = IP_PORTRANGE_LOW;
-               sin = (struct sockaddr_in *)sa;
-               salen = sizeof(struct sockaddr_in);
-               portp = &sin->sin_port;
-               break;
-#ifdef INET6
-       case AF_INET6:
-               proto = IPPROTO_IPV6;
-               portrange = IPV6_PORTRANGE;
-               portlow = IPV6_PORTRANGE_LOW;
-               sin6 = (struct sockaddr_in6 *)sa;
-               salen = sizeof(struct sockaddr_in6);
-               portp = &sin6->sin6_port;
-               break;
-#endif
-       default:
-               errno = EPFNOSUPPORT;
-               return (-1);
-       }
-       sa->sa_family = af;
-
-       if (*portp == 0) {
-               socklen_t oldlen = sizeof(old);
-
-               error = getsockopt(sd, proto, portrange, &old, &oldlen);
-               if (error < 0)
-                       return (error);
-
-               error = setsockopt(sd, proto, portrange, &portlow,
-                   sizeof(portlow));
-               if (error < 0)
-                       return (error);
-       }
-
-       error = bind(sd, sa, salen);
-
-       if (*portp == 0) {
-               int saved_errno = errno;
-
-               if (error < 0) {
-                       if (setsockopt(sd, proto, portrange, &old,
-                           sizeof(old)) < 0)
-                               errno = saved_errno;
-                       return (error);
-               }
-
-               if (sa != (struct sockaddr *)&myaddr) {
-                       /* Hmm, what did the kernel assign? */
-                       if (getsockname(sd, sa, &salen) < 0)
-                               errno = saved_errno;
-                       return (error);
-               }
-       }
-       return (error);
 }
-#endif
--- libtirpc-0.2.2.orig/tirpc/rpc/rpc.h
+++ libtirpc-0.2.2/tirpc/rpc/rpc.h
@@ -79,6 +79,10 @@
 #define UDPMSGSIZE 8800
 #endif
 
+/* Change the real name of our bindresvport() function so it can easily
+ * call libc's bindresvport() */
+#define bindresvport tirpc_bindresvport
+
 __BEGIN_DECLS
 extern int get_myaddress(struct sockaddr_in *);
 extern int bindresvport(int, struct sockaddr_in *) __THROW;
---

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to