Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 22 Feb 1999 18:05:04 +0000 (18:05 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 22 Feb 1999 18:05:04 +0000 (18:05 +0000)
1999-02-23  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>

* elf/dl-error.c (_dl_signal_cerror): New function.
(_dl_signal_error): Don't call receiver function.
* elf/dl-lookup.c (_dl_lookup_symbol): Call _dl_signal_cerror
instead of _dl_signal_error when reporting references to undefined
symbols or versions.
(_dl_lookup_versioned_symbol): Likewise.
(_dl_lookup_versioned_symbol_skip): Likewise.
* elf/dl-version.c (match_symbol): Likewise.

* elf/ldsodefs.h: Declare _dl_signal_cerror.

* misc/getttyent.c (getttyent): Release lock on stream later to
also protect global variable zapchar.

ChangeLog
elf/dl-error.c
elf/dl-lookup.c
elf/dl-version.c
elf/ldsodefs.h
misc/getttyent.c

index 10fd76b..055c014 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
+1999-02-23  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>
+
+       * elf/dl-error.c (_dl_signal_cerror): New function.
+       (_dl_signal_error): Don't call receiver function.
+       * elf/dl-lookup.c (_dl_lookup_symbol): Call _dl_signal_cerror
+       instead of _dl_signal_error when reporting references to undefined
+       symbols or versions.
+       (_dl_lookup_versioned_symbol): Likewise.
+       (_dl_lookup_versioned_symbol_skip): Likewise.
+       * elf/dl-version.c (match_symbol): Likewise.
+
+       * elf/ldsodefs.h: Declare _dl_signal_cerror.
+
 1999-02-22  Ulrich Drepper  <drepper@cygnus.com>
 
+       * misc/getttyent.c (getttyent): Release lock on stream later to
+       also protect global variable zapchar.
+
        * sysdeps/unix/sysv/linux/clock.c: Don't test return value of
        __times [PR libc/990].
 
index 9ccc193..e802c27 100644 (file)
@@ -43,7 +43,7 @@ __libc_tsd_define (static, DL_ERROR)
 #define tsd_setspecific(data)  __libc_tsd_set (DL_ERROR, (data))
 
 
-/* This points to a function which is called when an error is
+/* This points to a function which is called when an continuable error is
    received.  Unlike the handling of `catch' this function may return.
    The arguments will be the `errstring' and `objname'.
 
@@ -84,13 +84,6 @@ _dl_signal_error (int errcode,
        }
       longjmp (lcatch->env, errcode ?: -1);
     }
-  else if (receiver)
-    {
-      /* We are inside _dl_receive_error.  Call the user supplied
-        handler and resume the work.  The receiver will still be
-        installed.  */
-      (*receiver) (errcode, objname, errstring);
-    }
   else
     {
       /* Lossage while resolving the program's own symbols is always fatal.  */
@@ -105,6 +98,25 @@ _dl_signal_error (int errcode,
     }
 }
 
+
+void
+internal_function
+_dl_signal_cerror (int errcode,
+                  const char *objname,
+                  const char *errstring)
+{
+  if (receiver)
+    {
+      /* We are inside _dl_receive_error.  Call the user supplied
+        handler and resume the work.  The receiver will still be
+        installed.  */
+      (*receiver) (errcode, objname, errstring);
+    }
+  else
+    _dl_signal_error (errcode, objname, errstring);
+}
+
+
 int
 internal_function
 _dl_catch_error (char **errstring,
index 9a691b7..16173c9 100644 (file)
@@ -96,10 +96,10 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
     {
       if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
        /* We could find no value for a strong reference.  */
-       _dl_signal_error (0, (reference_name  && reference_name[0]
-                             ? reference_name
-                             : (_dl_argv[0] ?: "<main program>")),
-                         make_string (undefined_msg, undef_name));
+       _dl_signal_cerror (0, (reference_name  && reference_name[0]
+                              ? reference_name
+                              : (_dl_argv[0] ?: "<main program>")),
+                          make_string (undefined_msg, undef_name));
       *ref = NULL;
       return 0;
     }
@@ -199,29 +199,33 @@ _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref,
        break;
 
       if (res < 0)
-       /* Oh, oh.  The file named in the relocation entry does not
-          contain the needed symbol.  */
-       _dl_signal_error (0, (reference_name && reference_name[0]
-                             ? reference_name
-                             : (_dl_argv[0] ?: "<main program>")),
-                         make_string ("symbol ", undef_name, ", version ",
-                                      version->name,
-                                      " not defined in file ",
-                                      version->filename,
-                                      " with link time reference",
-                                      res == -2
-                                      ? " (no version symbols)" : ""));
+       {
+         /* Oh, oh.  The file named in the relocation entry does not
+            contain the needed symbol.  */
+         _dl_signal_cerror (0, (reference_name && reference_name[0]
+                                ? reference_name
+                                : (_dl_argv[0] ?: "<main program>")),
+                            make_string ("symbol ", undef_name, ", version ",
+                                         version->name,
+                                         " not defined in file ",
+                                         version->filename,
+                                         " with link time reference",
+                                         res == -2
+                                         ? " (no version symbols)" : ""));
+         *ref = NULL;
+         return 0;
+       }
     }
 
   if (current_value.s == NULL)
     {
       if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
        /* We could find no value for a strong reference.  */
-       _dl_signal_error (0, (reference_name && reference_name[0]
-                             ? reference_name
-                             : (_dl_argv[0] ?: "<main program>")),
-                         make_string (undefined_msg, undef_name,
-                                      ", version ", version->name ?: NULL));
+       _dl_signal_cerror (0, (reference_name && reference_name[0]
+                              ? reference_name
+                              : (_dl_argv[0] ?: "<main program>")),
+                          make_string (undefined_msg, undef_name,
+                                       ", version ", version->name ?: NULL));
       *ref = NULL;
       return 0;
     }
@@ -281,9 +285,9 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
          char buf[sizeof undefined_msg + len];
          __mempcpy (__mempcpy (buf, undefined_msg, sizeof undefined_msg - 1),
                     undef_name, len + 1);
-         _dl_signal_error (0, (reference_name && reference_name[0]
-                               ? reference_name
-                               : (_dl_argv[0] ?: "<main program>")), buf);
+         _dl_signal_cerror (0, (reference_name && reference_name[0]
+                                ? reference_name
+                                : (_dl_argv[0] ?: "<main program>")), buf);
        }
       *ref = NULL;
       return 0;
index fbc4165..8d59fe2 100644 (file)
@@ -93,9 +93,10 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string,
         object was linked against another version of this file.  We
         only print a message if verbose output is requested.  */
       if (verbose)
-       _dl_signal_error (0, map->l_name, make_string ("\
+       _dl_signal_cerror (0, map->l_name,
+                          make_string ("\
 no version information available (required by ",
-                                                      name, ")"));
+                                       name, ")"));
       return 0;
     }
 
@@ -143,16 +144,16 @@ no version information available (required by ",
   if (weak)
     {
       if (verbose)
-       _dl_signal_error (0, map->l_name,
-                         make_string ("weak version `", string,
-                                      "' not found (required by ", name,
-                                      ")"));
+       _dl_signal_cerror (0, map->l_name,
+                          make_string ("weak version `", string,
+                                       "' not found (required by ", name,
+                                       ")"));
       return 0;
     }
 
-  _dl_signal_error (0, map->l_name,
-                   make_string ("version `", string,
-                                "' not found (required by ", name, ")"));
+  _dl_signal_cerror (0, map->l_name,
+                    make_string ("version `", string,
+                                 "' not found (required by ", name, ")"));
   return 1;
 }
 
index 61652dd..392ea17 100644 (file)
@@ -208,6 +208,13 @@ extern void _dl_signal_error (int errcode,
      internal_function
      __attribute__ ((__noreturn__));
 
+/* Like _dl_signal_error, but may return when called in the context of
+   _dl_receive_error.  */
+extern void _dl_signal_cerror (int errcode,
+                              const char *object,
+                              const char *errstring)
+     internal_function;
+
 /* Call OPERATE, catching errors from `dl_signal_error'.  If there is no
    error, *ERRSTRING is set to null.  If there is an error, *ERRSTRING is
    set to a string constructed from the strings passed to _dl_signal_error,
@@ -219,7 +226,7 @@ extern int _dl_catch_error (char **errstring,
                            void *args)
      internal_function;
 
-/* Call OPERATE, receiving errors from `dl_signal_error'.  Unlike
+/* Call OPERATE, receiving errors from `dl_signal_cerror'.  Unlike
    `_dl_catch_error' the operation is resumed after the OPERATE
    function returns.
    ARGS is passed as argument to OPERATE.  */
index f73cb79..009ad9c 100644 (file)
@@ -93,7 +93,6 @@ getttyent()
                if (*p && *p != '#')
                        break;
        }
-       funlockfile(tf);
 
        zapchar = 0;
        tty.ty_name = p;
@@ -124,6 +123,8 @@ getttyent()
                else
                        break;
        }
+       /* We can release the lock only here since `zapchar' is global.  */
+       funlockfile(tf);
 
        if (zapchar == '#' || *p == '#')
                while ((c = *++p) == ' ' || c == '\t')