aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linux/linux_elf.c
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2023-04-26 13:56:41 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2023-04-26 13:56:41 +0000
commit76f8584e49cf7eedaa2e1312593bf46c7225d79a (patch)
treec018bc4beebc4e1cbf231dd74565291c9c7bc923 /sys/compat/linux/linux_elf.c
parent727fd8a73df595453572b1f89e569d01c77eb63e (diff)
downloadsrc-76f8584e49cf7eedaa2e1312593bf46c7225d79a.tar.gz
src-76f8584e49cf7eedaa2e1312593bf46c7225d79a.zip
linux(4): Don't relie on process osreldata when testing features
The ELF note identifyies the operating-system ABI that the executable was created for. The note data of the Glibc executable contains the earliest release number of the Linux kernel that supports this ABI. As of a current 2.37 version of Glibc, it is 3.2.0 for x86, 3.7.0 for Aarch64. Glibc does not use this release number and the current kernel's LINUX_VERSION_CODE to detect kernel features, using fallbacks to known previous way in case of ENOSYS or something else instead. A dynamically linked Glibc reads the current kernel's LINUX_VERSION_CODE from the ELF note in the vDSO or fallback to uname syscall if the vDSO can't be located and parse the release field in struct utsname. Glibc uses the current kernel's LINUX_VERSION_CODE for "kernel too old" check. While here use inlined LINUX_KERNVER for tests to improve readability, as suggested by emaste@. MFC after: 1 month
Diffstat (limited to 'sys/compat/linux/linux_elf.c')
-rw-r--r--sys/compat/linux/linux_elf.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/compat/linux/linux_elf.c b/sys/compat/linux/linux_elf.c
index f335f18e252f..1af861122f81 100644
--- a/sys/compat/linux/linux_elf.c
+++ b/sys/compat/linux/linux_elf.c
@@ -492,6 +492,7 @@ linux_trans_osrel(const Elf_Note *note, int32_t *osrel)
int
__linuxN(copyout_auxargs)(struct image_params *imgp, uintptr_t base)
{
+ struct thread *td = curthread;
Elf_Auxargs *args;
Elf_Auxinfo *aarray, *pos;
struct proc *p;
@@ -526,14 +527,13 @@ __linuxN(copyout_auxargs)(struct image_params *imgp, uintptr_t base)
AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid);
AUXARGS_ENTRY(pos, LINUX_AT_SECURE, issetugid);
- if (p->p_osrel >= LINUX_KERNVER_2006030 || p->p_osrel == 0)
+ if (linux_kernver(td) >= LINUX_KERNVER(2,6,30))
AUXARGS_ENTRY_PTR(pos, LINUX_AT_RANDOM, imgp->canary);
- if ((p->p_osrel >= LINUX_KERNVER_2006026 || p->p_osrel == 0) &&
- imgp->execpathp != 0)
+ if (linux_kernver(td) >= LINUX_KERNVER(2,6,26) && imgp->execpathp != 0)
AUXARGS_ENTRY(pos, LINUX_AT_EXECFN, PTROUT(imgp->execpathp));
if (args->execfd != -1)
AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd);
- if (p->p_osrel >= LINUX_KERNVER_5013000 || p->p_osrel == 0)
+ if (linux_kernver(td) >= LINUX_KERNVER(5,13,0))
AUXARGS_ENTRY(pos, LINUX_AT_MINSIGSTKSZ,
imgp->sysent->sv_minsigstksz);
AUXARGS_ENTRY(pos, AT_NULL, 0);