2005-11-16 23:20:22

by Jordan Crouse

[permalink] [raw]
Subject: PATCH: Fix poor pointer math in devinet_sysctl_register

This patch fixes pointer math that under certain circumstances, results
in really bad pointers. This was encountered on a system compiled for i486, so
other compilers may differ, but I don't think it hurts anyone.

Signed-off-by: Jordan Crouse <[email protected]>
---

net/ipv4/devinet.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 4ec4b2c..7585fce 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1454,7 +1454,7 @@ static void devinet_sysctl_register(stru
return;
memcpy(t, &devinet_sysctl, sizeof(*t));
for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
- t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
+ t->devinet_vars[i].data += (int)((char *)p - (char *)&ipv4_devconf);
t->devinet_vars[i].de = NULL;
}



2005-11-17 06:14:35

by Andrew Morton

[permalink] [raw]
Subject: Re: PATCH: Fix poor pointer math in devinet_sysctl_register

"Jordan Crouse" <[email protected]> wrote:
>
> This patch fixes pointer math that under certain circumstances, results
> in really bad pointers. This was encountered on a system compiled for i486, so
> other compilers may differ, but I don't think it hurts anyone.
>
> Signed-off-by: Jordan Crouse <[email protected]>
> ---
>
> net/ipv4/devinet.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
> index 4ec4b2c..7585fce 100644
> --- a/net/ipv4/devinet.c
> +++ b/net/ipv4/devinet.c
> @@ -1454,7 +1454,7 @@ static void devinet_sysctl_register(stru
> return;
> memcpy(t, &devinet_sysctl, sizeof(*t));
> for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
> - t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
> + t->devinet_vars[i].data += (int)((char *)p - (char *)&ipv4_devconf);

Confused. These appear to be equivalent (on 32-bit CPUs, anyway).

2005-11-17 07:13:37

by David Miller

[permalink] [raw]
Subject: Re: PATCH: Fix poor pointer math in devinet_sysctl_register

From: Andrew Morton <[email protected]>
Date: Wed, 16 Nov 2005 22:14:12 -0800

> "Jordan Crouse" <[email protected]> wrote:
> > @@ -1454,7 +1454,7 @@ static void devinet_sysctl_register(stru
> > return;
> > memcpy(t, &devinet_sysctl, sizeof(*t));
> > for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
> > - t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
> > + t->devinet_vars[i].data += (int)((char *)p - (char *)&ipv4_devconf);
>
> Confused. These appear to be equivalent (on 32-bit CPUs, anyway).

Indeed, please describe the exact failure case when posting
such patches.

2005-11-17 10:53:19

by Mikael Pettersson

[permalink] [raw]
Subject: Re: PATCH: Fix poor pointer math in devinet_sysctl_register

Jordan Crouse writes:
> This patch fixes pointer math that under certain circumstances, results
> in really bad pointers. This was encountered on a system compiled for i486, so
> other compilers may differ, but I don't think it hurts anyone.
>
> Signed-off-by: Jordan Crouse <[email protected]>
> ---
>
> net/ipv4/devinet.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
> index 4ec4b2c..7585fce 100644
> --- a/net/ipv4/devinet.c
> +++ b/net/ipv4/devinet.c
> @@ -1454,7 +1454,7 @@ static void devinet_sysctl_register(stru
> return;
> memcpy(t, &devinet_sysctl, sizeof(*t));
> for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
> - t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
> + t->devinet_vars[i].data += (int)((char *)p - (char *)&ipv4_devconf);
> t->devinet_vars[i].de = NULL;
> }

This is the same code which broke due to a known gcc-4.0.0 bug:
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21173>. If you're
indeed using gcc-4.0.0, then it's time to upgrade.

/Mikael

2005-11-17 15:00:41

by Jordan Crouse

[permalink] [raw]
Subject: Re: PATCH: Fix poor pointer math in devinet_sysctl_register

> This is the same code which broke due to a known gcc-4.0.0 bug:
> <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21173>. If you're
> indeed using gcc-4.0.0, then it's time to upgrade.
>
Indeed, I am using 4.0.0, so may indeed be it. I'll upgrade and take
another shot at it.

Thanks,

Jordan

--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<http://www.amd.com/embeddedprocessors>