From c41baa797637904ab405f14b78e722176abbdca1 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 9 Jun 1999 11:42:30 +0000 Subject: Update. 1999-06-09 Jakub Jelinek * stdlib/longlong.h: gas changed sethi handling when without %hi(). Fix assembly. * sysdeps/generic/dl-cache.c (_dl_cache_lookup): Allow port specific cache id checks. * sysdeps/generic/dl-cache.h: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h: New file. --- sysdeps/generic/dl-cache.c | 16 ++++++++++------ sysdeps/generic/dl-cache.h | 23 +++++++++++++++++++++++ sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h | 23 +++++++++++++++++++++++ 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 sysdeps/generic/dl-cache.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h (limited to 'sysdeps') diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c index 582afb51c3..36d3dc37aa 100644 --- a/sysdeps/generic/dl-cache.c +++ b/sysdeps/generic/dl-cache.c @@ -20,6 +20,7 @@ #include #include #include +#include /* System-dependent function to read a file's whole contents in the most convenient manner available. */ @@ -48,9 +49,12 @@ struct cache_file static struct cache_file *cache; static size_t cachesize; +/* 1 if cache_data + PTR points into the cache. */ +#define _dl_cache_verify_ptr(ptr) (ptr < cachesize - sizeof *cache) + /* This is the cache ID we expect. Normally it is 3 for glibc linked binaries. */ -int _dl_correct_cache_id = 3; +int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID; /* Helper function which must match the one in ldconfig, so that we rely on the same sort order. */ @@ -146,7 +150,7 @@ _dl_load_cache_lookup (const char *name) while (left <= right) { /* Make sure string table indices are not bogus before using them. */ - if (cache->libs[middle].key >= cachesize - sizeof *cache) + if (! _dl_cache_verify_ptr (cache->libs[middle].key)) { cmpres = 1; break; @@ -177,7 +181,7 @@ _dl_load_cache_lookup (const char *name) while (middle > 0 /* Make sure string table indices are not bogus before using them. */ - && cache->libs[middle - 1].key < cachesize - sizeof *cache + && _dl_cache_verify_ptr (cache->libs[middle - 1].key) /* Actually compare the entry. */ && (_dl_cache_libcmp (name, cache_data + cache->libs[middle - 1].key) @@ -193,15 +197,15 @@ _dl_load_cache_lookup (const char *name) /* We haven't seen this string so far. Test whether the index is ok and whether the name matches. Otherwise we are done. */ - && (cache->libs[middle].key >= cachesize - sizeof *cache + && (! _dl_cache_verify_ptr (cache->libs[middle].key) || (_dl_cache_libcmp (name, cache_data + cache->libs[middle].key) != 0))) break; flags = cache->libs[middle].flags; - if ((flags == 1 || flags == 3) - && cache->libs[middle].value < cachesize - sizeof *cache) + if (_dl_cache_check_flags (flags) + && _dl_cache_verify_ptr (cache->libs[middle].value)) { if (best == NULL || flags == _dl_correct_cache_id) { diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h new file mode 100644 index 0000000000..579c261af1 --- /dev/null +++ b/sysdeps/generic/dl-cache.h @@ -0,0 +1,23 @@ +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. + Copyright (C) 1999 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define _DL_CACHE_DEFAULT_ID 3 + +#define _dl_cache_check_flags(flags) \ + ((flags) == 1 || (flags) == _DL_CACHE_DEFAULT_ID) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h b/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h new file mode 100644 index 0000000000..2d074ffa9c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h @@ -0,0 +1,23 @@ +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. + Copyright (C) 1999 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define _DL_CACHE_DEFAULT_ID 0x103 + +#define _dl_cache_check_flags(flags) \ + ((flags) == _DL_CACHE_DEFAULT_ID) -- cgit 1.4.1