2006-08-31 23:13:29

by Eric Sesterhenn

[permalink] [raw]
Subject: [Patch] Uninitialized variable in drivers/net/wan/syncppp.c

hi,

this was spotted by coverity (id #891), when
len is equal to 4, we dont call sppp_lcp_conf_parse_options(),
to initialize rmagic.

Signed-off-by: Eric Sesterhenn <[email protected]>

--- linux-2.6.18-rc5/drivers/net/wan/syncppp.c.orig 2006-09-01 00:55:08.000000000 +0200
+++ linux-2.6.18-rc5/drivers/net/wan/syncppp.c 2006-09-01 00:55:45.000000000 +0200
@@ -505,14 +505,15 @@ static void sppp_lcp_input (struct sppp
skb->len, h);
break;
case LCP_CONF_REQ:
- if (len < 4) {
+ if (len <= 4) {
if (sp->pp_flags & PP_DEBUG)
printk (KERN_DEBUG"%s: invalid lcp configure request packet length: %d bytes\n",
dev->name, len);
break;
}
- if (len>4 && !sppp_lcp_conf_parse_options (sp, h, len, &rmagic))
+ if (!sppp_lcp_conf_parse_options (sp, h, len, &rmagic))
goto badreq;
+
if (rmagic == sp->lcp.magic) {
/* Local and remote magics equal -- loopback? */
if (sp->pp_loopcnt >= MAXALIVECNT*5) {



2006-08-31 23:45:29

by Paul Fulghum

[permalink] [raw]
Subject: Re: [Patch] Uninitialized variable in drivers/net/wan/syncppp.c

On Fri, 2006-09-01 at 01:13 +0200, Eric Sesterhenn wrote:

> --- linux-2.6.18-rc5/drivers/net/wan/syncppp.c.orig 2006-09-01 00:55:08.000000000 +0200
> +++ linux-2.6.18-rc5/drivers/net/wan/syncppp.c 2006-09-01 00:55:45.000000000 +0200
> @@ -505,14 +505,15 @@ static void sppp_lcp_input (struct sppp
> skb->len, h);
> break;
> case LCP_CONF_REQ:
> - if (len < 4) {
> + if (len <= 4) {
> if (sp->pp_flags & PP_DEBUG)
> printk (KERN_DEBUG"%s: invalid lcp configure request packet length: %d bytes\n",
> dev->name, len);
> break;
> }
> - if (len>4 && !sppp_lcp_conf_parse_options (sp, h, len, &rmagic))
> + if (!sppp_lcp_conf_parse_options (sp, h, len, &rmagic))
> goto badreq;
> +
> if (rmagic == sp->lcp.magic) {
> /* Local and remote magics equal -- loopback? */
> if (sp->pp_loopcnt >= MAXALIVECNT*5) {

This is not correct.

>From RFC1661:
Valid LCP configuration requests can have zero options (len == 4).
If the magic number option is not included in the LCP CFG REQ,
then the magic number should be treated as zero.

The correct fix is to initialize rmagic to zero before
the if (len>4 && !sppp_lcp_conf_parse_options()) line.

--
Paul


2006-09-01 00:26:13

by Eric Sesterhenn

[permalink] [raw]
Subject: Re: [Patch] Uninitialized variable in drivers/net/wan/syncppp.c

hi,

On Thu, 2006-08-31 at 18:45 -0500, Paul Fulghum wrote:
> Valid LCP configuration requests can have zero options (len == 4).
> If the magic number option is not included in the LCP CFG REQ,
> then the magic number should be treated as zero.
>
> The correct fix is to initialize rmagic to zero before
> the if (len>4 && !sppp_lcp_conf_parse_options()) line.

Thanks for clarification. Here is an updated patch, which has the advantage
of also silencing the gcc warning.

For len equal to 4, we never call sppp_lcp_conf_parse_options(),
therefore rmagic does not get initialized.

Signed-off-by: Eric Sesterhenn <[email protected]>

--- linux-2.6.18-rc5/drivers/net/wan/syncppp.c.orig 2006-09-01 02:16:18.000000000 +0200
+++ linux-2.6.18-rc5/drivers/net/wan/syncppp.c 2006-09-01 02:16:40.000000000 +0200
@@ -469,7 +469,7 @@ static void sppp_lcp_input (struct sppp
struct net_device *dev = sp->pp_if;
int len = skb->len;
u8 *p, opt[6];
- u32 rmagic;
+ u32 rmagic = 0;

if (!pskb_may_pull(skb, sizeof(struct lcp_header))) {
if (sp->pp_flags & PP_DEBUG)


2006-09-01 01:02:10

by Paul Fulghum

[permalink] [raw]
Subject: Re: [Patch] Uninitialized variable in drivers/net/wan/syncppp.c

Eric Sesterhenn wrote:
> Thanks for clarification. Here is an updated patch, which has the advantage
> of also silencing the gcc warning.
>
> For len equal to 4, we never call sppp_lcp_conf_parse_options(),
> therefore rmagic does not get initialized.
>
> Signed-off-by: Eric Sesterhenn <[email protected]>
>
> --- linux-2.6.18-rc5/drivers/net/wan/syncppp.c.orig 2006-09-01 02:16:18.000000000 +0200
> +++ linux-2.6.18-rc5/drivers/net/wan/syncppp.c 2006-09-01 02:16:40.000000000 +0200
> @@ -469,7 +469,7 @@ static void sppp_lcp_input (struct sppp
> struct net_device *dev = sp->pp_if;
> int len = skb->len;
> u8 *p, opt[6];
> - u32 rmagic;
> + u32 rmagic = 0;
>
> if (!pskb_may_pull(skb, sizeof(struct lcp_header))) {
> if (sp->pp_flags & PP_DEBUG)

Acked-by: Paul Fulghum <[email protected]>