2005-12-28 17:13:39

by Parag Warudkar

[permalink] [raw]
Subject: [PATCH 2.6.15-rc7] udf/balloc.c : Fix use of uninitialized data

2.6.15-rc7 - GCC warns correctly -
fs/udf/balloc.c: In function 'udf_table_new_block':
fs/udf/balloc.c:757: warning: 'goal_eloc.logicalBlockNum' may be used
uninitialized in this function

Variable goal_eloc is automatic, non-static and initialized conditionally -

if (nspread < spread)
{
...........
goal_eloc = eloc;
...........
}

The following patch fixes this by initializing the goal_eloc variable to zero.
Hopefully zero should be better than some random data! (Patch also
attached in case of problem with below inline version.) Compile
tested.

--- linux-2.6/fs/udf/balloc.c.orig 2005-12-28 11:53:12.000000000 -0500
+++ linux-2.6/fs/udf/balloc.c 2005-12-28 11:53:19.000000000 -0500
@@ -754,7 +754,8 @@ static int udf_table_new_block(struct su
uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF;
uint32_t newblock = 0, adsize;
uint32_t extoffset, goal_extoffset, elen, goal_elen = 0;
- kernel_lb_addr bloc, goal_bloc, eloc, goal_eloc;
+ kernel_lb_addr bloc, goal_bloc, eloc,
+ goal_eloc = { .logicalBlockNum=0, .partitionReferenceNum=0 } ;
struct buffer_head *bh, *goal_bh;
int8_t etype;


Attachments:
(No filename) (1.15 kB)
patch (555.00 B)
Download all attachments

2005-12-28 17:37:45

by Parag Warudkar

[permalink] [raw]
Subject: Re: [PATCH 2.6.15-rc7] udf/balloc.c : Fix use of uninitialized data

Forgot to add Signed-off-by - corrected patch follows -

Signed-off-by: Parag Warudkar <[email protected]>

Variable goal_eloc is automatic, non-static and initialized conditionally.
The following patch fixes this by initializing the goal_eloc variable to zero.
Hopefully zero should be better than some random data! (Patch also
attached in case of problem with below inline version.) Compile
tested.

--- linux-2.6/fs/udf/balloc.c.orig 2005-12-28 11:53:12.000000000 -0500
+++ linux-2.6/fs/udf/balloc.c 2005-12-28 11:53:19.000000000 -0500
@@ -754,7 +754,8 @@ static int udf_table_new_block(struct su
uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF;
uint32_t newblock = 0, adsize;
uint32_t extoffset, goal_extoffset, elen, goal_elen = 0;
- kernel_lb_addr bloc, goal_bloc, eloc, goal_eloc;
+ kernel_lb_addr bloc, goal_bloc, eloc,
+ goal_eloc = { .logicalBlockNum=0, .partitionReferenceNum=0 } ;
struct buffer_head *bh, *goal_bh;
int8_t etype;

2005-12-28 18:47:05

by Al Viro

[permalink] [raw]
Subject: Re: [PATCH 2.6.15-rc7] udf/balloc.c : Fix use of uninitialized data

On Wed, Dec 28, 2005 at 12:13:37PM -0500, Parag Warudkar wrote:
> 2.6.15-rc7 - GCC warns correctly -
> fs/udf/balloc.c: In function 'udf_table_new_block':
> fs/udf/balloc.c:757: warning: 'goal_eloc.logicalBlockNum' may be used
> uninitialized in this function
>
> Variable goal_eloc is automatic, non-static and initialized conditionally -
>
> if (nspread < spread)
> {
> ...........
> goal_eloc = eloc;
> ...........
> }
>
> The following patch fixes this by initializing the goal_eloc variable to zero.
> Hopefully zero should be better than some random data!

Wrong. RTFS, please. They have

spread = 0xffffffff;
while (....) {
...
if (nspread < spread) {
spread = nspread;
...
goal_eloc = eloc;
...
}
...
}
...
if (spread == 0xffffffff) {
...
return 0;
}
....
use goal_eloc

which is absolutely correct - to reach the use of goal_eloc we have to
have passed through reassignment of spread between spread = 0xffffffff
and departure via if (spread == 0xffffffff). Such reassignment could
happen only in one block and in the same block we have assignment to
goal_eloc.