This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.18-657-gb9ab448


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  b9ab448f980e296eac21ac65f53783967cc6037b (commit)
      from  f889953b44da50bf8a7824c97d09dbe03fd11b83 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=b9ab448f980e296eac21ac65f53783967cc6037b

commit b9ab448f980e296eac21ac65f53783967cc6037b
Author: Brooks Moses <bmoses@google.com>
Date:   Wed Dec 11 16:58:12 2013 -0800

    Add error reporting (via errno) to getauxval().
    
    [BZ 15846] As discussed in the recent thread on my $EXEC_ORIGIN patch
    and in BZ 15846, getauxval() presently has no unambiguous way of
    reporting an error condition.  It currently returns zero on error, but
    this may also be a valid result for some auxv entries.  As there is no
    clear invalid result for all current and future auxv entries, this patch
    sets errno (following a suggestion in the BZ entry).
    
    This version of the patch also adds documentation and tests for the
    value-not-found conditions in getauxval().

diff --git a/ChangeLog b/ChangeLog
index 76e323f..173c280 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2013-12-18  Brooks Moses  <bmoses@google.com>
+
+	[BZ #15846]
+	* misc/getauxval.c: Include errno.h.
+	(__getauxval): Set errno to ENOENT if the requested type is not
+	found.
+	* misc/sys/auxv.h (getauxval): Document that it may set errno;
+	don't declare with __attribute_const__.
+	* elf/tst-auxv.c: Add tests for errno and type-not-found case.
+	* manual/startup.texi: Document that getauxval sets errno.
+
 2013-12-18  Joseph Myers  <joseph@codesourcery.com>
 
 	* math/auto-libm-test-in: Add tests of jn and yn.
diff --git a/elf/tst-auxv.c b/elf/tst-auxv.c
index 454c0b0..0fb3ad5 100644
--- a/elf/tst-auxv.c
+++ b/elf/tst-auxv.c
@@ -16,6 +16,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <elf.h>
+#include <errno.h>
 #include <link.h>
 #include <string.h>
 #include <stdio.h>
@@ -25,14 +26,37 @@
 static int
 do_test (int argc, char *argv[])
 {
-  const char *execfn = (const char *) getauxval (AT_EXECFN);
+  errno = 0;
+  const char *execfn = (const char *) getauxval (AT_NULL);
+
+  if (errno != ENOENT)
+    {
+      printf ("errno is %d rather than %d (ENOENT) on failure\n", errno,
+	      ENOENT);
+      return 1;
+    }
+
+  if (execfn != NULL)
+    {
+      printf ("getauxval return value is nonzero on failure\n");
+      return 1;
+    }
+
+  errno = 0;
+  execfn = (const char *) getauxval (AT_EXECFN);
 
   if (execfn == NULL)
     {
-      printf ("No AT_EXECFN found, test skipped\n");
+      printf ("No AT_EXECFN found, AT_EXECFN test skipped\n");
       return 0;
     }
 
+  if (errno != 0)
+    {
+      printf ("errno erroneously set to %d on success\n", errno);
+      return 1;
+    }
+
   if (strcmp (argv[0], execfn) != 0)
     {
       printf ("Mismatch: argv[0]: %s vs. AT_EXECFN: %s\n", argv[0], execfn);
diff --git a/manual/startup.texi b/manual/startup.texi
index a277714..edd1de4 100644
--- a/manual/startup.texi
+++ b/manual/startup.texi
@@ -625,7 +625,8 @@ basis there may be information that is not available any other way.
 This function is used to inquire about the entries in the auxiliary
 vector.  The @var{type} argument should be one of the @samp{AT_} symbols
 defined in @file{elf.h}.  If a matching entry is found, the value is
-returned; if the entry is not found, zero is returned.
+returned; if the entry is not found, zero is returned and @code{errno} is
+set to @code{ENOENT}.
 @end deftypefun
 
 For some platforms, the key @code{AT_HWCAP} is the easiest way to inquire
diff --git a/misc/getauxval.c b/misc/getauxval.c
index e0317fd..dd4c8ec 100644
--- a/misc/getauxval.c
+++ b/misc/getauxval.c
@@ -16,6 +16,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sys/auxv.h>
+#include <errno.h>
 #include <ldsodefs.h>
 
 
@@ -32,6 +33,8 @@ __getauxval (unsigned long int type)
   for (p = GLRO(dl_auxv); p->a_type != AT_NULL; p++)
     if (p->a_type == type)
       return p->a_un.a_val;
+
+  __set_errno (ENOENT);
   return 0;
 }
 
diff --git a/misc/sys/auxv.h b/misc/sys/auxv.h
index a69250b..7aec3a0 100644
--- a/misc/sys/auxv.h
+++ b/misc/sys/auxv.h
@@ -27,9 +27,9 @@ __BEGIN_DECLS
 
 /* Return the value associated with an Elf*_auxv_t type from the auxv list
    passed to the program on startup.  If TYPE was not present in the auxv
-   list, returns zero.  */
+   list, returns zero and sets errno to ENOENT.  */
 extern unsigned long int getauxval (unsigned long int __type)
-  __THROW __attribute_const__;
+  __THROW;
 
 __END_DECLS
 

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog           |   11 +++++++++++
 elf/tst-auxv.c      |   28 ++++++++++++++++++++++++++--
 manual/startup.texi |    3 ++-
 misc/getauxval.c    |    3 +++
 misc/sys/auxv.h     |    4 ++--
 5 files changed, 44 insertions(+), 5 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]