X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=1b55e0774b9818c0f4807bab35d46876977ba0c7;hb=b7c683be35586f671d91c9883c9a41920938df9b;hp=3fafb181a728528afeda74711571714053828878;hpb=623753ad64a3625b010c10c00c45262d2eec2495;p=musl diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 3fafb181..1b55e077 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1,3 +1,4 @@ +#ifdef __PIC__ #include #include #include @@ -60,7 +61,7 @@ static int runtime; static jmp_buf rtld_fail; static pthread_rwlock_t lock; -#define AUX_CNT 15 +#define AUX_CNT 24 #define DYN_CNT 34 static void decode_vec(size_t *v, size_t *a, size_t cnt) @@ -482,6 +483,13 @@ void *__dynlink(int argc, char **argv, size_t *got) decode_vec(auxv, aux, AUX_CNT); + /* Only trust user/env if kernel says we're not suid/sgid */ + if ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID] + || aux[AT_GID]!=aux[AT_EGID] || aux[AT_SECURE]) { + env_path = 0; + env_preload = 0; + } + for (i=0; auxv[i]; i+=2) { if (auxv[i]==AT_SYSINFO_EHDR) { vdso_base = auxv[i+1]; @@ -489,13 +497,6 @@ void *__dynlink(int argc, char **argv, size_t *got) } } - /* Only trust user/env if kernel says we're not suid/sgid */ - if ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID] - || aux[AT_GID]!=aux[AT_EGID]) { - env_path = 0; - env_preload = 0; - } - /* Relocate ldso's DYNAMIC pointer and load vector */ decode_vec((void *)(got[0] += aux[AT_BASE]), lib_dyn, DYN_CNT); @@ -681,3 +682,4 @@ int dlclose(void *p) { return 0; } +#endif