Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b24c421 authored by Jiri Kosina's avatar Jiri Kosina Committed by James Bottomley
Browse files

[PARISC] fix personality flag check in copy_thread()



Directly comparing task_struct->personality against PER_* is not fully
correct, as it doesn't take flags potentially stored in top three bytes
into account.

Analogically, directly forcefully setting personality to PER_LINUX32 or
PER_LINUX discards any flags stored in the top three bytes.

Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent bba3d8c3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -309,7 +309,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
		cregs->ksp = (unsigned long)stack
			+ (pregs->gr[21] & (THREAD_SIZE - 1));
		cregs->gr[30] = usp;
		if (p->personality == PER_HPUX) {
		if (personality(p->personality) == PER_HPUX) {
#ifdef CONFIG_HPUX
			cregs->kpc = (unsigned long) &hpux_child_return;
#else
+4 −4
Original line number Diff line number Diff line
@@ -225,12 +225,12 @@ long parisc_personality(unsigned long personality)
	long err;

	if (personality(current->personality) == PER_LINUX32
	    && personality == PER_LINUX)
		personality = PER_LINUX32;
	    && personality(personality) == PER_LINUX)
		personality = (personality & ~PER_MASK) | PER_LINUX32;

	err = sys_personality(personality);
	if (err == PER_LINUX32)
		err = PER_LINUX;
	if (personality(err) == PER_LINUX32)
		err = (err & ~PER_MASK) | PER_LINUX;

	return err;
}