diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-06-09 11:42:30 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-06-09 11:42:30 +0000 |
commit | c41baa797637904ab405f14b78e722176abbdca1 (patch) | |
tree | 720faabeff78ecdd3175c541e6a7be15152f82e1 /sysdeps/generic | |
parent | c4db7573223ad5add43eaf89b08829a0225a8a03 (diff) | |
download | glibc-c41baa797637904ab405f14b78e722176abbdca1.zip glibc-c41baa797637904ab405f14b78e722176abbdca1.tar.gz glibc-c41baa797637904ab405f14b78e722176abbdca1.tar.bz2 |
Update.
1999-06-09 Jakub Jelinek <jj@ultra.linux.cz>
* 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.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/dl-cache.c | 16 | ||||
-rw-r--r-- | sysdeps/generic/dl-cache.h | 23 |
2 files changed, 33 insertions, 6 deletions
diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c index 582afb5..36d3dc3 100644 --- a/sysdeps/generic/dl-cache.c +++ b/sysdeps/generic/dl-cache.c @@ -20,6 +20,7 @@ #include <unistd.h> #include <elf/ldsodefs.h> #include <sys/mman.h> +#include <dl-cache.h> /* 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 0000000..579c261 --- /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) |