Linux MIPS Architecture development
 help / color / mirror / Atom feed
* Re: Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken
       [not found] <20060730183939.7119.48747.reportbug@hardknott.home.whinlatter.ukfsn.org>
@ 2006-07-30 22:41 ` Martin Michlmayr
  2006-07-30 23:19   ` Thiemo Seufer
  2006-07-30 23:20   ` Roger Leigh
  0 siblings, 2 replies; 3+ messages in thread
From: Martin Michlmayr @ 2006-07-30 22:41 UTC (permalink / raw)
  To: linux-mips; +Cc: Roger Leigh, 380531-silent

[-- Attachment #1: Type: text/plain, Size: 1247 bytes --]

FYI, but report tht "mips and mipsel personality(2) support is broken"

* Roger Leigh <rleigh@debian.org> [2006-07-30 19:39]:
> personality(2) only works the first time it is called [in the lifetime
> of a process/program].  All subsequent calls return EPERM, which is
> not a documented return value; I can see no mention of it in
> kernel/execdomain.c.  None of the other architectures I have tested
> (amd64, arm, i386, ia64, powerpc) behave this way: personality(2) is
> not a privileged call.
> 
> This happens no matter what the value of persona is, even if it is
> just 0xffffffff to query the current personality.
> 
> The attached testcase demonstrates the breakage.  On a working
> platform (powerpc), the output is like this:
> 
> ------------------------
> $ ./testpersona
> Getting personality
> Get returned '0'
> Setting personality '8'
> Set OK
> Getting personality
> Get returned '8'
> Setting personality '0'
> Set OK
> Getting personality
> Get returned '0'
> ------------------------
> 
> 0 == PER_LINUX
> 8 == PER_LINUX32
> 
> It successfully switched from PER_LINUX to PER_LINUX32 and back again,
> checking the personality before and after each change.
> 
> 
> Regards,
> Roger

-- 
Martin Michlmayr
http://www.cyrius.com/

[-- Attachment #2: testpersona.c --]
[-- Type: text/x-csrc, Size: 739 bytes --]

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/personality.h>

int
set_persona (unsigned long p)
{
  fprintf (stderr, "Setting personality '%lu'\n", p);

  int status = personality(p);
  if (status == -1)
    fprintf(stderr, "Set failed: %s\n", strerror(errno));

  fprintf(stderr, "Set OK\n");

  return status;
}

int
get_persona (void)
{
  fprintf (stderr, "Getting personality\n");

  int status = personality(0xffffffff);
  if (status == -1)
    fprintf(stderr, "Get failed: %s\n", strerror(errno));

  fprintf(stderr, "Get returned '%d'\n", status);

  return status;
}

int
main (void)
{
  get_persona();
  set_persona(PER_LINUX32);
  get_persona();
  set_persona(PER_LINUX);
  get_persona();
  return 0;
}

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken
  2006-07-30 22:41 ` Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken Martin Michlmayr
@ 2006-07-30 23:19   ` Thiemo Seufer
  2006-07-30 23:20   ` Roger Leigh
  1 sibling, 0 replies; 3+ messages in thread
From: Thiemo Seufer @ 2006-07-30 23:19 UTC (permalink / raw)
  To: Martin Michlmayr; +Cc: linux-mips, Roger Leigh, 380531-silent

Martin Michlmayr wrote:
> FYI, but report tht "mips and mipsel personality(2) support is broken"

This patch fixes sys_personality for the o32 emulation by
 a) killing the sign extension bits
 b) tighten the bitmask match for current->personality (like it is done
    for x86_64)


Thiemo


Signed-off-by:  Thiemo Seufer <ths@networkno.de>


--- a/arch/mips/kernel/linux32.c
+++ b/arch/mips/kernel/linux32.c
@@ -1053,7 +1053,9 @@ asmlinkage long sys32_newuname(struct ne
 asmlinkage int sys32_personality(unsigned long personality)
 {
 	int ret;
-	if (current->personality == PER_LINUX32 && personality == PER_LINUX)
+	personality &= 0xffffffff;
+	if (personality(current->personality) == PER_LINUX32 &&
+	    personality == PER_LINUX)
 		personality = PER_LINUX32;
 	ret = sys_personality(personality);
 	if (ret == PER_LINUX32)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken
  2006-07-30 22:41 ` Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken Martin Michlmayr
  2006-07-30 23:19   ` Thiemo Seufer
@ 2006-07-30 23:20   ` Roger Leigh
  1 sibling, 0 replies; 3+ messages in thread
From: Roger Leigh @ 2006-07-30 23:20 UTC (permalink / raw)
  To: Martin Michlmayr; +Cc: linux-mips, 380531-silent

[-- Attachment #1: Type: text/plain, Size: 1746 bytes --]

Martin Michlmayr <tbm@cyrius.com> writes:

> FYI, but report tht "mips and mipsel personality(2) support is broken"
>
> * Roger Leigh <rleigh@debian.org> [2006-07-30 19:39]:
>> personality(2) only works the first time it is called [in the lifetime
>> of a process/program].  All subsequent calls return EPERM, which is
>> not a documented return value; I can see no mention of it in
>> kernel/execdomain.c.  None of the other architectures I have tested
>> (amd64, arm, i386, ia64, powerpc) behave this way: personality(2) is
>> not a privileged call.
>> 
>> This happens no matter what the value of persona is, even if it is
>> just 0xffffffff to query the current personality.

Just a follow up:

There is a twist to the behaviour:

If personality(2) is called with a personality other than 0xffffffff
(query), and it fails, a subsequent call (any persona value) will
succeed.

I can't see any reason for the behaviour looking at the
kernel/execdomain.c or arch/mips/kernel/linux32.c.  ths believes it's
due to a bug in the syscall interface:

<ths> I believe it is related to sign extension.
<ths> o32 queries with 0xffffffff, which is really 0xffffffffffffffff, then the kernel compares against 0xffffffff.
<rleigh> I haven't heard of that.  Is it MIPS-specific, or a 64-bit-specific thing?
<ths> mips uses sign-extended registers for 32bit values.
<ths> There's no 64bit mode switch.
<ths> (The argument for the sys32_personality should be int, not long.)


-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please sign and encrypt your mail.

[-- Attachment #2: Type: application/pgp-signature, Size: 188 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2006-07-30 23:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20060730183939.7119.48747.reportbug@hardknott.home.whinlatter.ukfsn.org>
2006-07-30 22:41 ` Bug#380531: linux-2.6: mips and mipsel personality(2) support is broken Martin Michlmayr
2006-07-30 23:19   ` Thiemo Seufer
2006-07-30 23:20   ` Roger Leigh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox