In sys_ia32.c file, in the do_sys32_msgrcv() function call, the value of
ipck.msgp is interpreted as a 64 bit address, whereas it is a 32 bit
address.
Hence, do_sys32_msgrcv() finally returns EFAULT(bad address) error.
The patch below takes care of this by type casting ipck.msgp to type u32.
The patch is created for 2.5.32 version of the kernel.
--- arch/ia64/ia32/sys_ia32.c Thu Sep 5 19:13:02 2002
+++ /home/sree/bug1054/sys_ia32.c Thu Sep 5 19:12:08 2002
@@ -2263,7 +2263,7 @@
err = -EFAULT;
if (copy_from_user(&ipck, uipck, sizeof(struct ipc_kludge)))
goto out;
- uptr = (void *)A(ipck.msgp);
+ uptr = (void *)A((u32)ipck.msgp);
msgtyp = ipck.msgtyp;
}
err = -ENOMEM;
I am not subscribed to lkml. Please send your replies to
"[email protected]".
regards,
Sreelatha
From: "R Sreelatha" <[email protected]>
Date: Thu, 5 Sep 2002 19:46:40 +0530
In sys_ia32.c file, in the do_sys32_msgrcv() function call, the value of
ipck.msgp is interpreted as a 64 bit address, whereas it is a 32 bit
address.
Hence, do_sys32_msgrcv() finally returns EFAULT(bad address) error.
The patch below takes care of this by type casting ipck.msgp to type u32.
The patch is created for 2.5.32 version of the kernel.
It's still broken.
Fix this instead by declaring ipc_kludge with the proper
32-bit types. This is why the identical code works on
sparc64 for sparc32 emulation. :-)
>>>>> On Thu, 5 Sep 2002 19:46:40 +0530, "R Sreelatha" <[email protected]> said:
R> In sys_ia32.c file, in the do_sys32_msgrcv() function call, the
R> value of ipck.msgp is interpreted as a 64 bit address, whereas it
R> is a 32 bit address. Hence, do_sys32_msgrcv() finally returns
R> EFAULT(bad address) error. The patch below takes care of this by
R> type casting ipck.msgp to type u32. The patch is created for
R> 2.5.32 version of the kernel.
Yes, this was obviously broken. I committed the attached patch to my 2.5
tree.
--david
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.532 -> 1.533
# arch/ia64/ia32/sys_ia32.c 1.18 -> 1.19
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/05 [email protected] 1.533
# ia64: Fix x86 struct ipc_kludge (reported by R Sreelatha, fix proposed by
# Dave Miller).
# --------------------------------------------
#
diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
--- a/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
+++ b/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
@@ -2111,8 +2111,8 @@
};
struct ipc_kludge {
- struct msgbuf *msgp;
- long msgtyp;
+ u32 msgp;
+ s32 msgtyp;
};
#define SEMOP 1
Yes, but Dave Millier claims that this patch is still broken, he says the
fix needs to be in `ipc_kludge'. I don't have access to my source tree
until this evening, have you looked at this?
On Thu, Sep 05, 2002 at 09:51:48AM -0700, David Mosberger wrote:
> >>>>> On Thu, 5 Sep 2002 19:46:40 +0530, "R Sreelatha" <[email protected]> said:
>
> R> In sys_ia32.c file, in the do_sys32_msgrcv() function call, the
> R> value of ipck.msgp is interpreted as a 64 bit address, whereas it
> R> is a 32 bit address. Hence, do_sys32_msgrcv() finally returns
> R> EFAULT(bad address) error. The patch below takes care of this by
> R> type casting ipck.msgp to type u32. The patch is created for
> R> 2.5.32 version of the kernel.
>
> Yes, this was obviously broken. I committed the attached patch to my 2.5
> tree.
>
> --david
>
> # This is a BitKeeper generated patch for the following project:
> # Project Name: Linux kernel tree
> # This patch format is intended for GNU patch command version 2.5 or higher.
> # This patch includes the following deltas:
> # ChangeSet 1.532 -> 1.533
> # arch/ia64/ia32/sys_ia32.c 1.18 -> 1.19
> #
> # The following is the BitKeeper ChangeSet Log
> # --------------------------------------------
> # 02/09/05 [email protected] 1.533
> # ia64: Fix x86 struct ipc_kludge (reported by R Sreelatha, fix proposed by
> # Dave Miller).
> # --------------------------------------------
> #
> diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
> --- a/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
> +++ b/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
> @@ -2111,8 +2111,8 @@
> };
>
> struct ipc_kludge {
> - struct msgbuf *msgp;
> - long msgtyp;
> + u32 msgp;
> + s32 msgtyp;
> };
>
> #define SEMOP 1
>
> _______________________________________________
> Linux-IA64 mailing list
> [email protected]
> http://lists.linuxia64.org/lists/listinfo/linux-ia64
--
Don Dugger
"Censeo Toto nos in Kansa esse decisse." - D. Gale
[email protected]
From: Don Dugger <[email protected]>
Date: Thu, 5 Sep 2002 10:43:12 -0600
Yes, but Dave Millier claims that this patch is still broken, he says the
fix needs to be in `ipc_kludge'. I don't have access to my source tree
until this evening, have you looked at this?
You didn't read David's patch at all, this is exactly what he is
doing, fixing the ipc_kludge declaration.
On Thu, Sep 05, 2002 at 09:51:48AM -0700, David Mosberger wrote:
> diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
> --- a/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
> +++ b/arch/ia64/ia32/sys_ia32.c Thu Sep 5 09:51:05 2002
> @@ -2111,8 +2111,8 @@
> };
>
> struct ipc_kludge {
> - struct msgbuf *msgp;
> - long msgtyp;
> + u32 msgp;
> + s32 msgtyp;
> };
>
> #define SEMOP 1
See?