Subject: [PATCH] nss: Export nscd hash function as __nss_hash [BZ #22459]
To: libc-alpha@sourceware.org
The hash function is used to compute hashes for the keys in the nscd
mapping files, so the hash algorithm is already part of the de-facto
glibc API because alternative nscd implementations need to compute
hashes in exactly the same way.
2017-11-20 Florian Weimer <fweimer@redhat.com>
[BZ #22459]
Export nscd hash function as __nss_hash.
* include/nss.h (__nss_hash): Declare hidden alias.
* nis/nis_hash.c (__nis_hash): Call __nss_hash. Turn into compat
symbol.
* nscd/Makefile (aux, nscd-modules): Remove nscd_hash.
* nscd/cache.c (cache_search, cache_add): Call __nss_hash instead
of __nscd_hash.
* nscd/nscd_helper.c (__nscd_cache_search): Likewise.
* nscd/nscd_hash.h, nscd/nscd_hash.c: Remove files.
* nss/Makefiles (routines): Add nss_hash.
* nss/Versions (GLIBC_2.27): Export __nss_hash.
* nss/nss.h (__nss_hash): Declare.
* nss/nss_hash.c: Rename from nis/nis_hash.c.
(__nss_hash): Rename from __nis_hash. Define hidden alias.
* nis/rpcsvc/nislib.h (__nis_hash): Remove declaration.
* sysdeps/unix/sysv/linux/**/libc*.abilist: Update.
@@ -11,5 +11,7 @@ _Bool __nss_valid_list_field (char **list) attribute_hidden;
const char *__nss_rewrite_field (const char *value, char **to_be_freed)
attribute_hidden;
+libc_hidden_proto (__nss_hash)
+
# endif /* !_ISOMAC */
#endif /* _NSS_H */
@@ -1,6 +1,6 @@
-/* Copyright (c) 1997-2017 Free Software Foundation, Inc.
+/* Forward __nis_hash calls to __nss_hash, for ABI compatibility.
+ Copyright (c) 2017 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -16,61 +16,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <stdint.h>
-#include <rpcsvc/nis.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT (libnsl, GLIBC_2_1, GLIBC_2_27)
+
+# include <nss.h>
-/* This is from libc/db/hash/hash_func.c, hash3 is static there */
-/*
- * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte
- * units. On the first time through the loop we get the "leftover bytes"
- * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle
- * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If
- * this routine is heavily used enough, it's worth the ugly coding.
- *
- * OZ's original sdbm hash
- */
uint32_t
__nis_hash (const void *keyarg, size_t len)
{
- const u_char *key;
- size_t loop;
- uint32_t h;
-
-#define HASHC h = *key++ + 65599 * h
-
- h = 0;
- key = keyarg;
- if (len > 0)
- {
- loop = (len + 8 - 1) >> 3;
- switch (len & (8 - 1))
- {
- case 0:
- do {
- HASHC;
- /* FALLTHROUGH */
- case 7:
- HASHC;
- /* FALLTHROUGH */
- case 6:
- HASHC;
- /* FALLTHROUGH */
- case 5:
- HASHC;
- /* FALLTHROUGH */
- case 4:
- HASHC;
- /* FALLTHROUGH */
- case 3:
- HASHC;
- /* FALLTHROUGH */
- case 2:
- HASHC;
- /* FALLTHROUGH */
- case 1:
- HASHC;
- } while (--loop);
- }
- }
- return h;
+ return __nss_hash (keyarg, len);
}
+
+compat_symbol (libnsl, __nis_hash, __nis_hash, GLIBC_2_1);
+
+#endif
@@ -244,7 +244,6 @@ extern uint32_t __nis_default_ttl (char *) __THROW;
extern unsigned int __nis_default_access (char *, unsigned int) __THROW;
extern fd_result *__nis_finddirectory (directory_obj *, const_nis_name) __THROW;
extern void __free_fdresult (fd_result *) __THROW;
-extern uint32_t __nis_hash (const void *__keyarg, size_t __len) __THROW;
/* NIS+ cache locking */
extern int __nis_lock_cache (void) __THROW;
@@ -25,7 +25,7 @@ include ../Makeconfig
ifneq ($(use-nscd),no)
routines := nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \
nscd_initgroups nscd_getserv_r nscd_netgroup
-aux := nscd_helper nscd_hash
+aux := nscd_helper
endif
# To find xmalloc.c
@@ -36,7 +36,7 @@ nscd-modules := nscd connections pwdcache getpwnam_r getpwuid_r grpcache \
getsrvbynm_r getsrvbypt_r servicescache \
dbg_log nscd_conf nscd_stat cache mem nscd_setup_thread \
xmalloc xstrdup aicache initgrcache gai res_hconf \
- netgroupcache nscd_hash
+ netgroupcache
ifeq ($(build-nscd)$(have-thread-library),yesyes)
@@ -29,10 +29,10 @@
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/uio.h>
+#include <nss.h>
#include "nscd.h"
#include "dbg_log.h"
-#include "nscd_hash.h"
/* Wrapper functions with error checking for standard functions. */
@@ -74,7 +74,7 @@ struct datahead *
cache_search (request_type type, const void *key, size_t len,
struct database_dyn *table, uid_t owner)
{
- unsigned long int hash = __nscd_hash (key, len) % table->head->module;
+ unsigned long int hash = __nss_hash (key, len) % table->head->module;
unsigned long int nsearched = 0;
struct datahead *result = NULL;
@@ -153,7 +153,7 @@ cache_add (int type, const void *key, size_t len, struct datahead *packet,
first ? _(" (first)") : "");
}
- unsigned long int hash = __nscd_hash (key, len) % table->head->module;
+ unsigned long int hash = __nss_hash (key, len) % table->head->module;
struct hashentry *newp;
newp = mempool_alloc (table, sizeof (struct hashentry), 0);
deleted file mode 100644
@@ -1,19 +0,0 @@
-/* Copyright (C) 2017 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
- <http://www.gnu.org/licenses/>. */
-
-#define __nis_hash __nscd_hash
-#include <nis/nis_hash.c>
deleted file mode 100644
@@ -1,21 +0,0 @@
-/* Copyright (C) 2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <stdint.h>
-
-extern uint32_t __nscd_hash (const void *__keyarg, size_t __len)
- attribute_hidden;
@@ -36,10 +36,9 @@
#include <sys/un.h>
#include <not-cancel.h>
#include <kernel-features.h>
+#include <nss.h>
#include "nscd-client.h"
-#include "nscd_hash.h"
-
/* Extra time we wait if the socket is still receiving data. This
value is in milliseconds. Note that the other side is nscd on the
@@ -451,7 +450,7 @@ struct datahead *
__nscd_cache_search (request_type type, const char *key, size_t keylen,
const struct mapped_database *mapped, size_t datalen)
{
- unsigned long int hash = __nscd_hash (key, keylen) % mapped->head->module;
+ unsigned long int hash = __nss_hash (key, keylen) % mapped->head->module;
size_t datasize = mapped->datasize;
ref_t trail = mapped->head->array[hash];
@@ -28,7 +28,7 @@ headers := nss.h
routines = nsswitch getnssent getnssent_r digits_dots \
valid_field valid_list_field rewrite_field \
$(addsuffix -lookup,$(databases)) \
- compat-lookup
+ compat-lookup nss_hash
# These are the databases that go through nss dispatch.
# Caution: if you add a database here, you must add its real name
@@ -8,6 +8,7 @@ libc {
__nss_hostname_digits_dots;
}
GLIBC_2.27 {
+ __nss_hash;
}
GLIBC_PRIVATE {
_nss_files_parse_grent; _nss_files_parse_pwent; _nss_files_parse_spent;
@@ -22,9 +22,9 @@
#define _NSS_H 1
#include <features.h>
+#include <stddef.h>
#include <stdint.h>
-
__BEGIN_DECLS
/* Possible results of lookup using a nss_* function. */
@@ -58,6 +58,10 @@ struct gaih_addrtuple
extern int __nss_configure_lookup (const char *__dbname,
const char *__string) __THROW;
+/* Compute a hash value for LENGTH bytes starting at KEY. This is the
+ hash function used by the nscd for the cache mapping files. */
+uint32_t __nss_hash (const void *__key, size_t __length);
+
__END_DECLS
#endif /* nss.h */
new file mode 100644
@@ -0,0 +1,77 @@
+/* Copyright (c) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
+
+ 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <nss.h>
+
+/* This is from libc/db/hash/hash_func.c, hash3 is static there */
+/*
+ * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte
+ * units. On the first time through the loop we get the "leftover bytes"
+ * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle
+ * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If
+ * this routine is heavily used enough, it's worth the ugly coding.
+ *
+ * OZ's original sdbm hash
+ */
+uint32_t
+__nss_hash (const void *keyarg, size_t len)
+{
+ const unsigned char *key;
+ size_t loop;
+ uint32_t h;
+
+#define HASHC h = *key++ + 65599 * h
+
+ h = 0;
+ key = keyarg;
+ if (len > 0)
+ {
+ loop = (len + 8 - 1) >> 3;
+ switch (len & (8 - 1))
+ {
+ case 0:
+ do {
+ HASHC;
+ /* FALLTHROUGH */
+ case 7:
+ HASHC;
+ /* FALLTHROUGH */
+ case 6:
+ HASHC;
+ /* FALLTHROUGH */
+ case 5:
+ HASHC;
+ /* FALLTHROUGH */
+ case 4:
+ HASHC;
+ /* FALLTHROUGH */
+ case 3:
+ HASHC;
+ /* FALLTHROUGH */
+ case 2:
+ HASHC;
+ /* FALLTHROUGH */
+ case 1:
+ HASHC;
+ } while (--loop);
+ }
+ }
+ return h;
+}
+
+libc_hidden_def (__nss_hash)
@@ -2104,6 +2104,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -2015,6 +2015,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -105,6 +105,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.4 GLIBC_2.4 A
@@ -1869,6 +1869,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -2034,6 +2034,7 @@ GLIBC_2.26 strtof128_l F
GLIBC_2.26 wcstof128 F
GLIBC_2.26 wcstof128_l F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1898,6 +1898,7 @@ GLIBC_2.26 strtof128_l F
GLIBC_2.26 wcstof128 F
GLIBC_2.26 wcstof128_l F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -106,6 +106,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.4 GLIBC_2.4 A
@@ -1983,6 +1983,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -2104,5 +2104,6 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -1958,6 +1958,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1956,6 +1956,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1954,6 +1954,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -1949,6 +1949,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -2145,5 +2145,6 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -1987,6 +1987,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1992,6 +1992,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -2199,5 +2199,6 @@ GLIBC_2.26 strtof128_l F
GLIBC_2.26 wcstof128 F
GLIBC_2.26 wcstof128_l F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -106,6 +106,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1987,6 +1987,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -1888,6 +1888,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -1873,6 +1873,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -1980,6 +1980,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -1917,6 +1917,7 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.27 strfromf128 F
@@ -2111,5 +2111,6 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -2111,5 +2111,6 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -2111,5 +2111,6 @@ GLIBC_2.26 pwritev2 F
GLIBC_2.26 pwritev64v2 F
GLIBC_2.26 reallocarray F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
@@ -1875,6 +1875,7 @@ GLIBC_2.26 strtof128_l F
GLIBC_2.26 wcstof128 F
GLIBC_2.26 wcstof128_l F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F
GLIBC_2.3 GLIBC_2.3 A
@@ -2118,5 +2118,6 @@ GLIBC_2.26 strtof128_l F
GLIBC_2.26 wcstof128 F
GLIBC_2.26 wcstof128_l F
GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __nss_hash F
GLIBC_2.27 glob F
GLIBC_2.27 glob64 F