Convert existing bindresvport() implementation into a more generic function used by both bindresvport() and bindresvport6(). --- The symbol version changes for this are a bit of a guess; I really have no idea what the difference is between the definitions in Versions and abilist/libc.abilist. Ben. bindrsvprt.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) --- eglibc-2.13.orig/sunrpc/bindrsvprt.c +++ eglibc-2.13/sunrpc/bindrsvprt.c @@ -121,29 +121,17 @@ /* * Bind a socket to a privileged IP port */ -int -bindresvport (int sd, struct sockaddr_in *sin) +static int +__bindresvport (int sd, struct sockaddr *addr, size_t addrlen, + in_port_t *addrport) { static short startport = STARTPORT; static short port; - struct sockaddr_in myaddr; int i; if (!blacklist_read) load_blacklist (); - if (sin == (struct sockaddr_in *) 0) - { - sin = &myaddr; - __bzero (sin, sizeof (*sin)); - sin->sin_family = AF_INET; - } - else if (sin->sin_family != AF_INET) - { - __set_errno (EAFNOSUPPORT); - return -1; - } - if (port == 0) { port = (__getpid () % NPORTS) + STARTPORT; @@ -160,14 +148,14 @@ { int j; - sin->sin_port = htons (port); + *addrport = htons (port); /* Check, if this port is not blacklisted. */ for (j = 0; j < list_size; j++) if (port == list[j]) goto try_next_port; - res = __bind (sd, sin, sizeof (struct sockaddr_in)); + res = __bind (sd, addr, addrlen); if (res >= 0 || errno != EADDRINUSE) break; @@ -187,4 +175,46 @@ return res; } + +int +bindresvport (int sd, struct sockaddr_in *sin) +{ + struct sockaddr_in myaddr; + + if (sin == (struct sockaddr_in *) 0) + { + sin = &myaddr; + __bzero (sin, sizeof (*sin)); + sin->sin_family = AF_INET; + } + else if (sin->sin_family != AF_INET) + { + __set_errno (EAFNOSUPPORT); + return -1; + } + + return __bindresvport (sd, (struct sockaddr *) sin, sizeof (*sin), + &sin->sin_port); +} libc_hidden_def (bindresvport) + +int +bindresvport6 (int sd, struct sockaddr_in6 *sin6) +{ + struct sockaddr_in6 myaddr; + + if (sin6 == (struct sockaddr_in6 *) 0) + { + sin6 = &myaddr; + __bzero (sin6, sizeof (*sin6)); + sin6->sin6_family = AF_INET6; + } + else if (sin6->sin6_family != AF_INET6) + { + __set_errno (EAFNOSUPPORT); + return -1; + } + + return __bindresvport (sd, (struct sockaddr *) sin6, sizeof (*sin6), + &sin6->sin6_port); +} --- eglibc-2.13.orig/sunrpc/Versions +++ eglibc-2.13/sunrpc/Versions @@ -116,6 +116,9 @@ GLIBC_2.3.4 { xdr_quad_t; xdr_u_quad_t; } + GLIBC_2.13_DEBIAN { + bindresvport6; + } GLIBC_PRIVATE { __libc_clntudp_bufcreate; __libc_rpc_getport; } --- eglibc-2.13.orig/Versions.def +++ eglibc-2.13/Versions.def @@ -30,6 +30,7 @@ GLIBC_2.11 GLIBC_2.12 GLIBC_2.13 + GLIBC_2.13_DEBIAN %ifdef USE_IN_LIBIO HURD_CTHREADS_0.3 %endif --- eglibc-2.13.orig/abilist/libc.abilist +++ eglibc-2.13/abilist/libc.abilist @@ -2229,3 +2229,5 @@ GLIBC_2.3 ia64-.*-linux.*/tls powerpc64-.*-linux.*/thread s390x-.*-linux.*/tls x86_64-.*-linux.*/tls _sys_errlist D 0x3f0 sys_errlist D 0x3f0 +GLIBC_2.13_DEBIAN .*-.*-linux.* .*-.*-gnu-gnu.* .*-.*-freebsd.*-gnu.* + bindresvport6 F ---
Attachment:
signature.asc
Description: This is a digitally signed message part