resolv: Move nss_dns into libc

No abilist updates are needed because the symbols were GLIBC_PRIVATE.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Florian Weimer 2021-07-19 07:55:27 +02:00
parent ea9878ec27
commit e1fcf21474
6 changed files with 82 additions and 57 deletions

36
include/nss_dns.h Normal file
View File

@ -0,0 +1,36 @@
/* Internal routines for nss_dns.
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _NSS_DNS_H
#define _NSS_DNS_H
#include <nss.h>
NSS_DECLARE_MODULE_FUNCTIONS (dns)
libc_hidden_proto (_nss_dns_getcanonname_r)
libc_hidden_proto (_nss_dns_gethostbyname3_r)
libc_hidden_proto (_nss_dns_gethostbyname2_r)
libc_hidden_proto (_nss_dns_gethostbyname_r)
libc_hidden_proto (_nss_dns_gethostbyname4_r)
libc_hidden_proto (_nss_dns_gethostbyaddr2_r)
libc_hidden_proto (_nss_dns_gethostbyaddr_r)
libc_hidden_proto (_nss_dns_getnetbyname_r)
libc_hidden_proto (_nss_dns_getnetbyaddr_r)
#endif

View File

@ -31,6 +31,9 @@ routines := \
dn_comp \ dn_comp \
dn_expand \ dn_expand \
dn_skipname \ dn_skipname \
dns-canon \
dns-host \
dns-network \
herror \ herror \
inet_addr \ inet_addr \
inet_ntop \ inet_ntop \
@ -175,18 +178,6 @@ libanl-shared-only-routines += libanl-compat
subdir-dirs = nss_dns subdir-dirs = nss_dns
vpath %.c nss_dns vpath %.c nss_dns
libnss_dns-routines := \
dns-canon \
dns-host \
dns-network \
# libnss_dns-routines
libnss_dns-inhibit-o = $(filter-out .os,$(object-suffixes))
ifeq ($(build-static-nss),yes)
routines += $(libnss_dns-routines) $(libresolv-routines)
static-only-routines += $(libnss_dns-routines) $(libresolv-routines)
endif
ifeq ($(run-built-tests),yes) ifeq ($(run-built-tests),yes)
ifneq (no,$(PERL)) ifneq (no,$(PERL))
tests-special += $(objpfx)mtrace-tst-leaks.out $(objpfx)mtrace-tst-leaks2.out \ tests-special += $(objpfx)mtrace-tst-leaks.out $(objpfx)mtrace-tst-leaks2.out \

View File

@ -123,6 +123,15 @@ libc {
__resolv_context_get_preinit; __resolv_context_get_preinit;
__resolv_context_put; __resolv_context_put;
__resp; __resp;
_nss_dns_getcanonname_r;
_nss_dns_gethostbyaddr2_r;
_nss_dns_gethostbyaddr_r;
_nss_dns_gethostbyname2_r;
_nss_dns_gethostbyname3_r;
_nss_dns_gethostbyname4_r;
_nss_dns_gethostbyname_r;
_nss_dns_getnetbyaddr_r;
_nss_dns_getnetbyname_r;
} }
} }
@ -214,15 +223,9 @@ libresolv {
libnss_dns { libnss_dns {
GLIBC_PRIVATE { GLIBC_PRIVATE {
_nss_dns_getcanonname_r; # Keep a version node (with a synthesized local: * directive) so that
_nss_dns_gethostbyaddr2_r; # __bss_* symbols are hidden on targets that need it.
_nss_dns_gethostbyaddr_r; __libnss_dns_version_placeholder;
_nss_dns_gethostbyname2_r;
_nss_dns_gethostbyname3_r;
_nss_dns_gethostbyname4_r;
_nss_dns_gethostbyname_r;
_nss_dns_getnetbyaddr_r;
_nss_dns_getnetbyname_r;
} }
} }

View File

@ -25,8 +25,7 @@
#include <nsswitch.h> #include <nsswitch.h>
#include <resolv/resolv_context.h> #include <resolv/resolv_context.h>
#include <resolv/resolv-internal.h> #include <resolv/resolv-internal.h>
#include <nss_dns.h>
NSS_DECLARE_MODULE_FUNCTIONS (dns)
#if PACKETSZ > 65536 #if PACKETSZ > 65536
# define MAXPACKET PACKETSZ # define MAXPACKET PACKETSZ
@ -185,3 +184,4 @@ _nss_dns_getcanonname_r (const char *name, char *buffer, size_t buflen,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_getcanonname_r)

View File

@ -82,6 +82,7 @@
#include "nsswitch.h" #include "nsswitch.h"
#include <arpa/nameser.h> #include <arpa/nameser.h>
#include <nss_dns.h>
#include <resolv/resolv-internal.h> #include <resolv/resolv-internal.h>
#include <resolv/resolv_context.h> #include <resolv/resolv_context.h>
@ -90,8 +91,6 @@
#include <resolv/mapv4v6addr.h> #include <resolv/mapv4v6addr.h>
#include <resolv/mapv4v6hostent.h> #include <resolv/mapv4v6hostent.h>
NSS_DECLARE_MODULE_FUNCTIONS (dns)
#define RESOLVSORT #define RESOLVSORT
#if PACKETSZ > 65536 #if PACKETSZ > 65536
@ -169,6 +168,7 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_gethostbyname3_r)
static enum nss_status static enum nss_status
gethostbyname3_context (struct resolv_context *ctx, gethostbyname3_context (struct resolv_context *ctx,
@ -283,7 +283,7 @@ gethostbyname3_context (struct resolv_context *ctx,
static enum nss_status static enum nss_status
check_name (const char *name, int *h_errnop) check_name (const char *name, int *h_errnop)
{ {
if (res_hnok (name)) if (__libc_res_hnok (name))
return NSS_STATUS_SUCCESS; return NSS_STATUS_SUCCESS;
*h_errnop = HOST_NOT_FOUND; *h_errnop = HOST_NOT_FOUND;
return NSS_STATUS_NOTFOUND; return NSS_STATUS_NOTFOUND;
@ -300,7 +300,7 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
return _nss_dns_gethostbyname3_r (name, af, result, buffer, buflen, errnop, return _nss_dns_gethostbyname3_r (name, af, result, buffer, buflen, errnop,
h_errnop, NULL, NULL); h_errnop, NULL, NULL);
} }
libc_hidden_def (_nss_dns_gethostbyname2_r)
enum nss_status enum nss_status
_nss_dns_gethostbyname_r (const char *name, struct hostent *result, _nss_dns_gethostbyname_r (const char *name, struct hostent *result,
@ -327,7 +327,7 @@ _nss_dns_gethostbyname_r (const char *name, struct hostent *result,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_gethostbyname_r)
enum nss_status enum nss_status
_nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
@ -419,15 +419,7 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_gethostbyname4_r)
extern enum nss_status _nss_dns_gethostbyaddr2_r (const void *addr,
socklen_t len, int af,
struct hostent *result,
char *buffer, size_t buflen,
int *errnop, int *h_errnop,
int32_t *ttlp);
hidden_proto (_nss_dns_gethostbyaddr2_r)
enum nss_status enum nss_status
_nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
@ -568,7 +560,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return NSS_STATUS_SUCCESS; return NSS_STATUS_SUCCESS;
} }
hidden_def (_nss_dns_gethostbyaddr2_r) libc_hidden_def (_nss_dns_gethostbyaddr2_r)
enum nss_status enum nss_status
@ -579,6 +571,7 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af,
return _nss_dns_gethostbyaddr2_r (addr, len, af, result, buffer, buflen, return _nss_dns_gethostbyaddr2_r (addr, len, af, result, buffer, buflen,
errnop, h_errnop, NULL); errnop, h_errnop, NULL);
} }
libc_hidden_def (_nss_dns_gethostbyaddr_r)
static void static void
addrsort (struct resolv_context *ctx, char **ap, int num) addrsort (struct resolv_context *ctx, char **ap, int num)
@ -672,10 +665,10 @@ getanswer_r (struct resolv_context *ctx,
{ {
case T_A: case T_A:
case T_AAAA: case T_AAAA:
name_ok = res_hnok; name_ok = __libc_res_hnok;
break; break;
case T_PTR: case T_PTR:
name_ok = res_dnok; name_ok = __libc_res_dnok;
break; break;
default: default:
*errnop = ENOENT; *errnop = ENOENT;
@ -810,7 +803,8 @@ getanswer_r (struct resolv_context *ctx,
if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1]) if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1])
continue; continue;
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); n = __libc_dn_expand (answer->buf, end_of_message, cp,
tbuf, sizeof tbuf);
if (__glibc_unlikely (n < 0 || (*name_ok) (tbuf) == 0)) if (__glibc_unlikely (n < 0 || (*name_ok) (tbuf) == 0))
{ {
++had_error; ++had_error;
@ -848,8 +842,9 @@ getanswer_r (struct resolv_context *ctx,
if (ttlp != NULL && ttl < *ttlp) if (ttlp != NULL && ttl < *ttlp)
*ttlp = ttl; *ttlp = ttl;
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); n = __libc_dn_expand (answer->buf, end_of_message, cp,
if (__glibc_unlikely (n < 0 || res_dnok (tbuf) == 0)) tbuf, sizeof tbuf);
if (__glibc_unlikely (n < 0 || __libc_res_dnok (tbuf) == 0))
{ {
++had_error; ++had_error;
continue; continue;
@ -881,7 +876,7 @@ getanswer_r (struct resolv_context *ctx,
switch (type) switch (type)
{ {
case T_PTR: case T_PTR:
if (__glibc_unlikely (strcasecmp (tname, bp) != 0)) if (__glibc_unlikely (__strcasecmp (tname, bp) != 0))
{ {
cp += n; cp += n;
continue; /* XXX - had_error++ ? */ continue; /* XXX - had_error++ ? */
@ -897,7 +892,7 @@ getanswer_r (struct resolv_context *ctx,
n = -1; n = -1;
} }
if (__glibc_unlikely (n < 0 || res_hnok (bp) == 0)) if (__glibc_unlikely (n < 0 || __libc_res_hnok (bp) == 0))
{ {
++had_error; ++had_error;
break; break;
@ -911,7 +906,7 @@ getanswer_r (struct resolv_context *ctx,
return NSS_STATUS_SUCCESS; return NSS_STATUS_SUCCESS;
case T_A: case T_A:
case T_AAAA: case T_AAAA:
if (__glibc_unlikely (strcasecmp (result->h_name, bp) != 0)) if (__glibc_unlikely (__strcasecmp (result->h_name, bp) != 0))
{ {
cp += n; cp += n;
continue; /* XXX - had_error++ ? */ continue; /* XXX - had_error++ ? */
@ -1060,7 +1055,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
*h_errnop = NO_RECOVERY; *h_errnop = NO_RECOVERY;
return NSS_STATUS_UNAVAIL; return NSS_STATUS_UNAVAIL;
} }
if (__glibc_unlikely (res_hnok (buffer) == 0)) if (__glibc_unlikely (__libc_res_hnok (buffer) == 0))
{ {
errno = EBADMSG; errno = EBADMSG;
*errnop = EBADMSG; *errnop = EBADMSG;
@ -1093,7 +1088,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
n = -1; n = -1;
} }
if (__glibc_unlikely (n < 0 || res_hnok (buffer) == 0)) if (__glibc_unlikely (n < 0 || __libc_res_hnok (buffer) == 0))
{ {
++had_error; ++had_error;
continue; continue;
@ -1142,8 +1137,9 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
if (ttlp != NULL && ttl < *ttlp) if (ttlp != NULL && ttl < *ttlp)
*ttlp = ttl; *ttlp = ttl;
n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); n = __libc_dn_expand (answer->buf, end_of_message, cp,
if (__glibc_unlikely (n < 0 || res_hnok (tbuf) == 0)) tbuf, sizeof tbuf);
if (__glibc_unlikely (n < 0 || __libc_res_hnok (tbuf) == 0))
{ {
++had_error; ++had_error;
continue; continue;

View File

@ -67,11 +67,10 @@
#include "nsswitch.h" #include "nsswitch.h"
#include <arpa/inet.h> #include <arpa/inet.h>
#include <arpa/nameser.h> #include <arpa/nameser.h>
#include <nss_dns.h>
#include <resolv/resolv-internal.h> #include <resolv/resolv-internal.h>
#include <resolv/resolv_context.h> #include <resolv/resolv_context.h>
NSS_DECLARE_MODULE_FUNCTIONS (dns)
/* Maximum number of aliases we allow. */ /* Maximum number of aliases we allow. */
#define MAX_NR_ALIASES 48 #define MAX_NR_ALIASES 48
@ -152,7 +151,7 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_getnetbyname_r)
enum nss_status enum nss_status
_nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result, _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
@ -246,7 +245,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
__resolv_context_put (ctx); __resolv_context_put (ctx);
return status; return status;
} }
libc_hidden_def (_nss_dns_getnetbyaddr_r)
static enum nss_status static enum nss_status
getanswer_r (const querybuf *answer, int anslen, struct netent *result, getanswer_r (const querybuf *answer, int anslen, struct netent *result,
@ -347,7 +346,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
n = -1; n = -1;
} }
if (n < 0 || res_dnok (bp) == 0) if (n < 0 || __libc_res_dnok (bp) == 0)
break; break;
cp += n; cp += n;
@ -381,7 +380,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
n = -1; n = -1;
} }
if (n < 0 || !res_hnok (bp)) if (n < 0 || !__libc_res_hnok (bp))
{ {
/* XXX What does this mean? The original form from bind /* XXX What does this mean? The original form from bind
returns NULL. Incrementing cp has no effect in any case. returns NULL. Incrementing cp has no effect in any case.
@ -469,7 +468,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
/* If we are out of digits now, there are two cases: /* If we are out of digits now, there are two cases:
1. We are done with digits and now see "in-addr.arpa". 1. We are done with digits and now see "in-addr.arpa".
2. This is not the droid we are looking for. */ 2. This is not the droid we are looking for. */
if (!isdigit (*p) && !strcasecmp (p, "in-addr.arpa")) if (!isdigit (*p) && !__strcasecmp (p, "in-addr.arpa"))
{ {
result->n_net = val; result->n_net = val;
return NSS_STATUS_SUCCESS; return NSS_STATUS_SUCCESS;