diff options
| author | Boaz Harrosh <bharrosh@panasas.com> | 2012-08-01 17:48:36 +0300 | 
|---|---|---|
| committer | Boaz Harrosh <bharrosh@panasas.com> | 2012-08-02 16:41:56 +0300 | 
| commit | 9e62bb4458ad2cf28bd701aa5fab380b846db326 (patch) | |
| tree | 951e8ec30887eba0506b0e673f4d26f9ad76591f /fs/exofs | |
| parent | be388f3d9af4155db0dc9e7e59dd49db90271c1c (diff) | |
ore: Fix out-of-bounds access in _ios_obj()
_ios_obj() is accessed by group_index not device_table index.
The oc->comps array is only a group_full of devices at a time
it is not like ore_comp_dev() which is indexed by a global
device_table index.
This did not BUG until now because exofs only uses a single
COMP for all devices. But with other FSs like PanFS this is
not true.
This bug was only in the write_path, all other users were
using it correctly
[This is a bug since 3.2 Kernel]
CC: Stable Tree <stable@kernel.org>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Diffstat (limited to 'fs/exofs')
| -rw-r--r-- | fs/exofs/ore.c | 14 | 
1 files changed, 7 insertions, 7 deletions
| diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c index 24a49d47e935..1585db1aa365 100644 --- a/fs/exofs/ore.c +++ b/fs/exofs/ore.c @@ -837,11 +837,11 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp)  				bio->bi_rw |= REQ_WRITE;  			} -			osd_req_write(or, _ios_obj(ios, dev), per_dev->offset, -				      bio, per_dev->length); +			osd_req_write(or, _ios_obj(ios, cur_comp), +				      per_dev->offset, bio, per_dev->length);  			ORE_DBGMSG("write(0x%llx) offset=0x%llx "  				      "length=0x%llx dev=%d\n", -				     _LLU(_ios_obj(ios, dev)->id), +				     _LLU(_ios_obj(ios, cur_comp)->id),  				     _LLU(per_dev->offset),  				     _LLU(per_dev->length), dev);  		} else if (ios->kern_buff) { @@ -853,20 +853,20 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp)  			       (ios->si.unit_off + ios->length >  				ios->layout->stripe_unit)); -			ret = osd_req_write_kern(or, _ios_obj(ios, per_dev->dev), +			ret = osd_req_write_kern(or, _ios_obj(ios, cur_comp),  						 per_dev->offset,  						 ios->kern_buff, ios->length);  			if (unlikely(ret))  				goto out;  			ORE_DBGMSG2("write_kern(0x%llx) offset=0x%llx "  				      "length=0x%llx dev=%d\n", -				     _LLU(_ios_obj(ios, dev)->id), +				     _LLU(_ios_obj(ios, cur_comp)->id),  				     _LLU(per_dev->offset),  				     _LLU(ios->length), per_dev->dev);  		} else { -			osd_req_set_attributes(or, _ios_obj(ios, dev)); +			osd_req_set_attributes(or, _ios_obj(ios, cur_comp));  			ORE_DBGMSG2("obj(0x%llx) set_attributes=%d dev=%d\n", -				     _LLU(_ios_obj(ios, dev)->id), +				     _LLU(_ios_obj(ios, cur_comp)->id),  				     ios->out_attr_len, dev);  		} | 
