diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rwxr-xr-x | debug/xtrace.sh | 2 | ||||
-rw-r--r-- | elf/dl-lookup.c | 83 | ||||
-rw-r--r-- | localedata/ChangeLog | 5 | ||||
-rw-r--r-- | localedata/tests-mbwc/tst_strfmon.c | 6 | ||||
-rw-r--r-- | localedata/tests-mbwc/tst_types.h | 2 | ||||
-rw-r--r-- | time/mktime.c | 14 | ||||
-rw-r--r-- | time/tst-mktime.c | 36 |
8 files changed, 115 insertions, 49 deletions
@@ -1,5 +1,21 @@ +2002-04-14 Jakub Jelinek <jakub@redhat.com> + + * elf/dl-lookup.c (_dl_lookup_symbol): Move add_dependency call to + the end of the function. Pass original flags to recursive call if + add_dependency failed. + (_dl_lookup_versioned_symbol): Likewise. + +2002-04-13 Jakub Jelinek <jakub@redhat.com> + + * time/mktime.c (__mktime_internal): If year is 69, don't bail out + early, but check whether it overflowed afterwards. + * time/tst-mktime.c (main): Add new tests. + 2002-04-14 Ulrich Drepper <drepper@redhat.com> + * debug/xtrace.sh: Fix program name in help message. + Patch by Roger Luethi <rl@hellgate.ch>. + * include/sys/stat.h: Add prototypes for __lxstat_internal and __lxstat64_internal. Add macros __lxstat and __lxstat64 if not NOT_IN_libc. diff --git a/debug/xtrace.sh b/debug/xtrace.sh index d103d08..a613e4e 100755 --- a/debug/xtrace.sh +++ b/debug/xtrace.sh @@ -115,7 +115,7 @@ while test $# -gt 0; do do_version ;; --*) - echo >&2 $"memprof: unrecognized option \`$1'" + echo >&2 $"xtrace: unrecognized option \`$1'" do_usage ;; *) diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 9d1e1f6..895b60d 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -228,24 +228,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, for (scope = symbol_scope; *scope; ++scope) if (do_lookup (undef_name, hash, *ref, ¤t_value, *scope, 0, flags, NULL, type_class)) - { - /* We have to check whether this would bind UNDEF_MAP to an object - in the global scope which was dynamically loaded. In this case - we have to prevent the latter from being unloaded unless the - UNDEF_MAP object is also unloaded. */ - if (__builtin_expect (current_value.m->l_type == lt_loaded, 0) - /* Don't do this for explicit lookups as opposed to implicit - runtime lookups. */ - && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0 - /* Add UNDEF_MAP to the dependencies. */ - && add_dependency (undef_map, current_value.m) < 0) - /* Something went wrong. Perhaps the object we tried to reference - was just removed. Try finding another definition. */ - return INTUSE(_dl_lookup_symbol) (undef_name, undef_map, ref, - symbol_scope, type_class, 0); - - break; - } + break; if (__builtin_expect (current_value.s == NULL, 0)) { @@ -266,8 +249,8 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, protected = *ref && ELFW(ST_VISIBILITY) ((*ref)->st_other) == STV_PROTECTED; if (__builtin_expect (protected != 0, 0)) { - /* It is very tricky. We need to figure out what value to - return for the protected symbol */ + /* It is very tricky. We need to figure out what value to + return for the protected symbol. */ struct sym_val protected_value = { NULL, NULL }; for (scope = symbol_scope; *scope; ++scope) @@ -282,6 +265,21 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, } } + /* We have to check whether this would bind UNDEF_MAP to an object + in the global scope which was dynamically loaded. In this case + we have to prevent the latter from being unloaded unless the + UNDEF_MAP object is also unloaded. */ + if (__builtin_expect (current_value.m->l_type == lt_loaded, 0) + /* Don't do this for explicit lookups as opposed to implicit + runtime lookups. */ + && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0 + /* Add UNDEF_MAP to the dependencies. */ + && add_dependency (undef_map, current_value.m) < 0) + /* Something went wrong. Perhaps the object we tried to reference + was just removed. Try finding another definition. */ + return INTUSE(_dl_lookup_symbol) (undef_name, undef_map, ref, + symbol_scope, type_class, flags); + if (__builtin_expect (GL(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, @@ -395,26 +393,7 @@ _dl_lookup_versioned_symbol (const char *undef_name, int res = do_lookup_versioned (undef_name, hash, *ref, ¤t_value, *scope, 0, version, NULL, type_class); if (res > 0) - { - /* We have to check whether this would bind UNDEF_MAP to an object - in the global scope which was dynamically loaded. In this case - we have to prevent the latter from being unloaded unless the - UNDEF_MAP object is also unloaded. */ - if (__builtin_expect (current_value.m->l_type == lt_loaded, 0) - /* Don't do this for explicit lookups as opposed to implicit - runtime lookups. */ - && flags != 0 - /* Add UNDEF_MAP to the dependencies. */ - && add_dependency (undef_map, current_value.m) < 0) - /* Something went wrong. Perhaps the object we tried to reference - was just removed. Try finding another definition. */ - return INTUSE(_dl_lookup_versioned_symbol) (undef_name, undef_map, - ref, symbol_scope, - version, type_class, - 0); - - break; - } + break; if (__builtin_expect (res, 0) < 0) { @@ -462,8 +441,8 @@ _dl_lookup_versioned_symbol (const char *undef_name, if (__builtin_expect (protected != 0, 0)) { - /* It is very tricky. We need to figure out what value to - return for the protected symbol */ + /* It is very tricky. We need to figure out what value to + return for the protected symbol. */ struct sym_val protected_value = { NULL, NULL }; for (scope = symbol_scope; *scope; ++scope) @@ -479,6 +458,22 @@ _dl_lookup_versioned_symbol (const char *undef_name, } } + /* We have to check whether this would bind UNDEF_MAP to an object + in the global scope which was dynamically loaded. In this case + we have to prevent the latter from being unloaded unless the + UNDEF_MAP object is also unloaded. */ + if (__builtin_expect (current_value.m->l_type == lt_loaded, 0) + /* Don't do this for explicit lookups as opposed to implicit + runtime lookups. */ + && flags != 0 + /* Add UNDEF_MAP to the dependencies. */ + && add_dependency (undef_map, current_value.m) < 0) + /* Something went wrong. Perhaps the object we tried to reference + was just removed. Try finding another definition. */ + return INTUSE(_dl_lookup_versioned_symbol) (undef_name, undef_map, + ref, symbol_scope, + version, type_class, flags); + if (__builtin_expect (GL(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, @@ -545,8 +540,8 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name, if (__builtin_expect (protected != 0, 0)) { - /* It is very tricky. We need to figure out what value to - return for the protected symbol */ + /* It is very tricky. We need to figure out what value to + return for the protected symbol. */ struct sym_val protected_value = { NULL, NULL }; if (i >= (*scope)->r_nlist diff --git a/localedata/ChangeLog b/localedata/ChangeLog index a7c876f..908f176 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,8 @@ +2002-04-14 Wolfram Gloger <wg@malloc.de> + + * tests-mbwc/tst_types.h: Increase MONSIZE. + * tests-mbwc/tst_strfmon.c: Fail test if buffer too small. + 2002-04-05 Jakub Jelinek <jakub@redhat.com> * locales/ms_MY (day): Fix a typo. diff --git a/localedata/tests-mbwc/tst_strfmon.c b/localedata/tests-mbwc/tst_strfmon.c index 8413f2c..b6c13a3 100644 --- a/localedata/tests-mbwc/tst_strfmon.c +++ b/localedata/tests-mbwc/tst_strfmon.c @@ -27,6 +27,12 @@ tst_strfmon (FILE * fp, int debug_flg) fmt = TST_INPUT (strfmon).fmt; val = TST_INPUT (strfmon).val; memset (buf, 0, MONSIZE); + if (nbt > MONSIZE) + { + err_count++; + Result (C_FAILURE, S_STRFMON, CASE_3, "buffer too small in test"); + continue; + } TST_CLEAR_ERRNO; ret = strfmon (buf, nbt, fmt, val, val, val); diff --git a/localedata/tests-mbwc/tst_types.h b/localedata/tests-mbwc/tst_types.h index 2bf5a4f..3d18279 100644 --- a/localedata/tests-mbwc/tst_types.h +++ b/localedata/tests-mbwc/tst_types.h @@ -19,7 +19,7 @@ #define MBSSIZE 24 #define WCSSIZE 12 #define MONFMTSIZE 16 -#define MONSIZE 32 +#define MONSIZE 64 #define USE_MBCURMAX 99 /* well, but ... */ #define TST_DBL_EPS 2.22153e-16 #define WCSTOK_SEQNUM 3 diff --git a/time/mktime.c b/time/mktime.c index 5632f14..1aec223 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -259,8 +259,10 @@ __mktime_internal (struct tm *tp, int sec_requested = sec; - /* Only years after 1970 are defined. */ - if (year < 70) + /* Only years after 1970 are defined. + If year is 69, it might still be representable due to + timezone differences. */ + if (year < 69) return -1; #if LEAP_SECONDS_POSSIBLE @@ -370,6 +372,14 @@ __mktime_internal (struct tm *tp, return -1; } + if (year == 69) + { + /* If year was 69, need to check whether the time was representable + or not. */ + if (t < 0 || t > 2 * 24 * 60 * 60) + return -1; + } + *tp = tm; return t; } diff --git a/time/tst-mktime.c b/time/tst-mktime.c index 70c123c..7ce1d45 100644 --- a/time/tst-mktime.c +++ b/time/tst-mktime.c @@ -5,7 +5,8 @@ int main (void) { - struct tm time_str; + struct tm time_str, *tm; + time_t t; char daybuf[20]; int result; @@ -29,5 +30,38 @@ main (void) result = strcmp (daybuf, "Wednesday") != 0; } + setenv ("TZ", "EST", 1); +#define EVENING69 1 * 60 * 60 + 2 * 60 + 29 + t = EVENING69; + tm = localtime (&t); + if (tm == NULL) + { + (void) puts ("localtime returned NULL"); + result = 1; + } + else + { + time_str = *tm; + t = mktime (&time_str); + if (t != EVENING69) + { + printf ("mktime returned %ld, expected %ld\n", + (long) t, EVENING69); + result = 1; + } + else + (void) puts ("Dec 31 1969 EST test passed"); + + setenv ("TZ", "CET", 1); + t = mktime (&time_str); + if (t != (time_t) -1) + { + printf ("mktime returned %ld, expected -1\n", (long) t); + result = 1; + } + else + (void) puts ("Dec 31 1969 CET test passed"); + } + return result; } |