56 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: sys/amd64/linux32/linux32_sysvec.c
 | |
| ===================================================================
 | |
| --- sys/amd64/linux32/linux32_sysvec.c	(revision 294778)
 | |
| +++ sys/amd64/linux32/linux32_sysvec.c	(working copy)
 | |
| @@ -248,6 +248,7 @@ elf_linux_fixup(register_t **stack_base, struct im
 | |
|  	Elf32_Addr *base;
 | |
|  	Elf32_Addr *pos, *uplatform;
 | |
|  	struct linux32_ps_strings *arginfo;
 | |
| +	int issetugid;
 | |
|  
 | |
|  	arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
 | |
|  	uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szplatform);
 | |
| @@ -258,6 +259,7 @@ elf_linux_fixup(register_t **stack_base, struct im
 | |
|  	args = (Elf32_Auxargs *)imgp->auxargs;
 | |
|  	pos = base + (imgp->args->argc + imgp->args->envc + 2);
 | |
|  
 | |
| +	issetugid = imgp->proc->p_flag & P_SUGID ? 1 : 0;
 | |
|  	AUXARGS_ENTRY_32(pos, LINUX_AT_HWCAP, cpu_feature);
 | |
|  
 | |
|  	/*
 | |
| @@ -277,7 +279,7 @@ elf_linux_fixup(register_t **stack_base, struct im
 | |
|  	AUXARGS_ENTRY_32(pos, AT_FLAGS, args->flags);
 | |
|  	AUXARGS_ENTRY_32(pos, AT_ENTRY, args->entry);
 | |
|  	AUXARGS_ENTRY_32(pos, AT_BASE, args->base);
 | |
| -	AUXARGS_ENTRY_32(pos, LINUX_AT_SECURE, 0);
 | |
| +	AUXARGS_ENTRY_32(pos, LINUX_AT_SECURE, issetugid);
 | |
|  	AUXARGS_ENTRY_32(pos, AT_UID, imgp->proc->p_ucred->cr_ruid);
 | |
|  	AUXARGS_ENTRY_32(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid);
 | |
|  	AUXARGS_ENTRY_32(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
 | |
| Index: sys/i386/linux/linux_sysvec.c
 | |
| ===================================================================
 | |
| --- sys/i386/linux/linux_sysvec.c	(revision 294778)
 | |
| +++ sys/i386/linux/linux_sysvec.c	(working copy)
 | |
| @@ -244,11 +244,13 @@ elf_linux_fixup(register_t **stack_base, struct im
 | |
|  	Elf32_Addr *uplatform;
 | |
|  	struct ps_strings *arginfo;
 | |
|  	register_t *pos;
 | |
| +	int issetugid;
 | |
|  
 | |
|  	KASSERT(curthread->td_proc == imgp->proc,
 | |
|  	    ("unsafe elf_linux_fixup(), should be curproc"));
 | |
|  
 | |
|  	p = imgp->proc;
 | |
| +	issetugid = imgp->proc->p_flag & P_SUGID ? 1 : 0;
 | |
|  	arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
 | |
|  	uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szplatform);
 | |
|  	args = (Elf32_Auxargs *)imgp->auxargs;
 | |
| @@ -273,7 +275,7 @@ elf_linux_fixup(register_t **stack_base, struct im
 | |
|  	AUXARGS_ENTRY(pos, AT_FLAGS, args->flags);
 | |
|  	AUXARGS_ENTRY(pos, AT_ENTRY, args->entry);
 | |
|  	AUXARGS_ENTRY(pos, AT_BASE, args->base);
 | |
| -	AUXARGS_ENTRY(pos, LINUX_AT_SECURE, 0);
 | |
| +	AUXARGS_ENTRY(pos, LINUX_AT_SECURE, issetugid);
 | |
|  	AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_ucred->cr_ruid);
 | |
|  	AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid);
 | |
|  	AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
 |