From b9ab448f980e296eac21ac65f53783967cc6037b Mon Sep 17 00:00:00 2001 From: Brooks Moses Date: Wed, 11 Dec 2013 16:58:12 -0800 Subject: 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(). --- elf/tst-auxv.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'elf') diff --git a/elf/tst-auxv.c b/elf/tst-auxv.c index 454c0b0221..0fb3ad5345 100644 --- a/elf/tst-auxv.c +++ b/elf/tst-auxv.c @@ -16,6 +16,7 @@ . */ #include +#include #include #include #include @@ -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); -- cgit v1.2.3