This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.18-657-gb9ab448
- From: brooks at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 18 Dec 2013 18:52:53 -0000
- Subject: 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