> -----Original Message----- > From: Vivian Wang <u...@dram.page> > Sent: Monday, July 22, 2024 4:24 PM > To: Yao, Xingtao/姚 幸涛 <yaoxt.f...@fujitsu.com>; qemu-devel@nongnu.org > Cc: Richard Henderson <r...@twiddle.net>; Laurent Vivier <laur...@vivier.eu> > Subject: Re: [PATCH 1/2] util/getauxval: Ensure setting errno if not found > > On 7/22/24 08:18, Xingtao Yao (Fujitsu) wrote: > > > >> -----Original Message----- > >> From: qemu-devel-bounces+yaoxt.fnst=fujitsu....@nongnu.org > >> <qemu-devel-bounces+yaoxt.fnst=fujitsu....@nongnu.org> On Behalf Of > Vivian > >> Wang > >> Sent: Sunday, July 21, 2024 5:08 PM > >> To: qemu-devel@nongnu.org > >> Cc: Vivian Wang <u...@dram.page>; Richard Henderson <r...@twiddle.net>; > >> Laurent Vivier <laur...@vivier.eu> > >> Subject: [PATCH 1/2] util/getauxval: Ensure setting errno if not found > >> > >> Sometimes zero is a valid value for getauxval (e.g. AT_EXECFD). Make > >> sure that we can distinguish between a valid zero value and a not found > >> entry by setting errno. > >> > >> Ignore getauxval from sys/auxv.h on glibc < 2.19 because it does not set > >> errno. > >> > >> Signed-off-by: Vivian Wang <u...@dram.page> > >> --- > >> util/getauxval.c | 14 ++++++++++++-- > >> 1 file changed, 12 insertions(+), 2 deletions(-) > >> > >> diff --git a/util/getauxval.c b/util/getauxval.c > >> index b124107d61..f1008bdc59 100644 > >> --- a/util/getauxval.c > >> +++ b/util/getauxval.c > >> @@ -24,7 +24,13 @@ > >> > >> #include "qemu/osdep.h" > >> > >> -#ifdef CONFIG_GETAUXVAL > >> +/* If glibc < 2.19, getauxval can't be used because it does not set errno > >> if > >> + entry is not found. */ > >> +#if defined(CONFIG_GETAUXVAL) && \ > >> + (!defined(__GLIBC__) \ > >> + || __GLIBC__ > 2 \ > >> + || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19)) > > you can use GLIB_CHECK_VERSION(2, 19, 0) instead > That wouldn't work. I'm testing for glibc, not glib. sorry, I misunderstood.
> >> + > >> /* Don't inline this in qemu/osdep.h, because pulling in <sys/auxv.h> for > >> the system declaration of getauxval pulls in the system <elf.h>, which > >> conflicts with qemu's version. */ > >> @@ -95,6 +101,7 @@ unsigned long qemu_getauxval(unsigned long type) > >> } > >> } > >> > >> + errno = ENOENT; > >> return 0; > >> } > >> > >> @@ -104,7 +111,9 @@ unsigned long qemu_getauxval(unsigned long type) > >> unsigned long qemu_getauxval(unsigned long type) > >> { > >> unsigned long aux = 0; > >> - elf_aux_info(type, &aux, sizeof(aux)); > >> + int ret = elf_aux_info(type, &aux, sizeof(aux)); > >> + if (ret != 0) > >> + errno = ret; > >> return aux; > >> } > >> > >> @@ -112,6 +121,7 @@ unsigned long qemu_getauxval(unsigned long type) > >> > >> unsigned long qemu_getauxval(unsigned long type) > >> { > >> + errno = ENOSYS; > >> return 0; > >> } > >> > >> -- > >> 2.45.1 > >>