libprocstat: simplify auxv value conversion

Avoid a weird dance through the union and treat all 32-bit values as
unsigned integers.  This avoids sign extension of flags and userspace
pointers.

Reviewed by:	markj
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D42198

(cherry picked from commit 9735cc0e41825bb9e95d16433d381ffe4c190f38)
This commit is contained in:
Brooks Davis 2023-10-16 17:52:57 +01:00
parent b2f6c1f548
commit d65a002ded

View file

@ -2414,7 +2414,6 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
{
Elf_Auxinfo *auxv;
Elf32_Auxinfo *auxv32;
void *ptr;
size_t len;
unsigned int i, count;
int name[4];
@ -2448,8 +2447,17 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
* necessarily true.
*/
auxv[i].a_type = auxv32[i].a_type;
ptr = &auxv32[i].a_un;
auxv[i].a_un.a_val = *((uint32_t *)ptr);
/*
* Don't sign extend values. Existing entries are positive
* integers or pointers. Under freebsd32, programs typically
* have a full [0, 2^32) address space (perhaps minus the last
* page) and treating this as a signed integer would be
* confusing since these are not kernel pointers.
*
* XXX: A more complete translation would be ABI and
* type-aware.
*/
auxv[i].a_un.a_val = (uint32_t)auxv32[i].a_un.a_val;
}
*cntp = count;
out: