diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-05-22 22:30:18 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-05-22 22:30:18 +0000 |
commit | 2373b30ea829ad5dd9599b29902c80101deefc78 (patch) | |
tree | 79874a0fea3457093e8f2834a2bf7bad41a1863a /elf/dl-sym.c | |
parent | 25e57b10f3943cefa888ba7f90e57bcda18ed7d8 (diff) | |
download | glibc-2373b30ea829ad5dd9599b29902c80101deefc78.tar.gz glibc-2373b30ea829ad5dd9599b29902c80101deefc78.tar.xz glibc-2373b30ea829ad5dd9599b29902c80101deefc78.zip |
Update.
2001-05-20 Bruno Haible <haible@clisp.cons.org> * iconvdata/cp1255.c: Completely rewritten. * iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1255. * iconvdata/testdata/WINDOWS-1255: New file. * iconvdata/testdata/WINDOWS-1255..UTF8: New file. * iconvdata/TESTS: Add WINDOWS-1255 test. * iconvdata/CP1255.irreversible: New file. 2001-05-20 Bruno Haible <haible@clisp.cons.org> * iconvdata/cp1258.c: Completely rewritten. * iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1258. * iconvdata/testdata/WINDOWS-1258: New file. * iconvdata/testdata/WINDOWS-1258..UTF8: New file. * iconvdata/TESTS: Add WINDOWS-1258 test. * iconvdata/tst-table-from.c (try): Reset the iconv descriptor before the main call, and flush it afterwards. (utf8_decode): Return a string, possibly containing several Unicode characters. (main): Update all utf8_decode calls. * iconvdata/CP1258.irreversible: New file. 2001-05-20 Bruno Haible <haible@clisp.cons.org> * iconv/gconv.c (__gconv): For flush without output, pass do_flush = 2. * iconv/skeleton.c: Distinguish do_flush = 1 and do_flush = 2. In the first case, set outbuf, outstart, outend, and call PREPARE_LOOP before EMIT_SHIFT_TO_INIT; then pass the output produced by this step down to the next step. In the second case, clear the state without calling EMIT_SHIFT_TO_INIT. * iconvdata/ibm930.c (EMIT_SHIFT_TO_INIT): Use outbuf instead of data->__outbuf, and outend instead of data->__outbufend. * iconvdata/ibm933.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/ibm935.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/ibm937.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/ibm939.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/iso-2022-cn.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/iso-2022-cn-ext.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/iso-2022-jp.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/iso-2022-kr.c (EMIT_SHIFT_TO_INIT): Likewise. * iconvdata/utf-7.c (EMIT_SHIFT_TO_INIT): Likewise. 2001-05-21 Jakub Jelinek <jakub@redhat.com> * elf/rtld.c (dl_main): Compute l_map_end for the main program. * elf/dl-sym.c (_dl_sym): Don't check for l_addr == 0. If match == _dl_loaded, caller can still come from the main program. (_dl_vsym): Likewise. * elf/dl-open.c (dl_open_worker): Don't check for l_addr == 0. * elf/dl-error.c (_dl_signal_error): Change NULL objname into "". * elf/restest2.c: New test. * elf/Makefile (tests): Add restest2. (restest2, LDFLAGS-restest2): Add rules.
Diffstat (limited to 'elf/dl-sym.c')
-rw-r--r-- | elf/dl-sym.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/elf/dl-sym.c b/elf/dl-sym.c index ffc36bc8f9..9ca2af81e4 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -41,7 +41,7 @@ _dl_sym (void *handle, const char *name, void *who) /* Find the highest-addressed object that CALLER is not below. */ for (l = _dl_loaded; l != NULL; l = l->l_next) - if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end) + if (caller >= l->l_map_start && caller < l->l_map_end) { /* There must be exactly one DSO for the range of the virtual memory. Otherwise something is really broken. */ @@ -65,8 +65,13 @@ _dl_sym (void *handle, const char *name, void *who) else { if (__builtin_expect (match == _dl_loaded, 0)) - _dl_signal_error (0, NULL, N_("\ + { + if (! _dl_loaded + || caller < _dl_loaded->l_map_start + || caller >= _dl_loaded->l_map_end) + _dl_signal_error (0, NULL, N_("\ RTLD_NEXT used in code not dynamically loaded")); + } l = match; while (l->l_loader != NULL) @@ -107,7 +112,7 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who) /* Find the highest-addressed object that CALLER is not below. */ for (l = _dl_loaded; l != NULL; l = l->l_next) - if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end) + if (caller >= l->l_map_start && caller < l->l_map_end) { /* There must be exactly one DSO for the range of the virtual memory. Otherwise something is really broken. */ @@ -121,9 +126,14 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who) &vers, 0, 0); else if (handle == RTLD_NEXT) { - if (match == _dl_loaded) - _dl_signal_error (0, NULL, N_("\ + if (__builtin_expect (match == _dl_loaded, 0)) + { + if (! _dl_loaded + || caller < _dl_loaded->l_map_start + || caller >= _dl_loaded->l_map_end) + _dl_signal_error (0, NULL, N_("\ RTLD_NEXT used in code not dynamically loaded")); + } l = match; while (l->l_loader != NULL) |