File tree Expand file tree Collapse file tree 2 files changed +17
-4
lines changed Expand file tree Collapse file tree 2 files changed +17
-4
lines changed Original file line number Diff line number Diff line change @@ -45,6 +45,7 @@ enum ceph_sparse_read_state {
45
45
CEPH_SPARSE_READ_HDR = 0 ,
46
46
CEPH_SPARSE_READ_EXTENTS ,
47
47
CEPH_SPARSE_READ_DATA_LEN ,
48
+ CEPH_SPARSE_READ_DATA_PRE ,
48
49
CEPH_SPARSE_READ_DATA ,
49
50
};
50
51
@@ -64,7 +65,7 @@ struct ceph_sparse_read {
64
65
u64 sr_req_len ; /* orig request length */
65
66
u64 sr_pos ; /* current pos in buffer */
66
67
int sr_index ; /* current extent index */
67
- __le32 sr_datalen ; /* length of actual data */
68
+ u32 sr_datalen ; /* length of actual data */
68
69
u32 sr_count ; /* extent count in reply */
69
70
int sr_ext_len ; /* length of extent array */
70
71
struct ceph_sparse_extent * sr_extent ; /* extent array */
Original file line number Diff line number Diff line change @@ -5857,8 +5857,8 @@ static int osd_sparse_read(struct ceph_connection *con,
5857
5857
struct ceph_osd * o = con -> private ;
5858
5858
struct ceph_sparse_read * sr = & o -> o_sparse_read ;
5859
5859
u32 count = sr -> sr_count ;
5860
- u64 eoff , elen ;
5861
- int ret ;
5860
+ u64 eoff , elen , len = 0 ;
5861
+ int i , ret ;
5862
5862
5863
5863
switch (sr -> sr_state ) {
5864
5864
case CEPH_SPARSE_READ_HDR :
@@ -5903,8 +5903,20 @@ static int osd_sparse_read(struct ceph_connection *con,
5903
5903
convert_extent_map (sr );
5904
5904
ret = sizeof (sr -> sr_datalen );
5905
5905
* pbuf = (char * )& sr -> sr_datalen ;
5906
- sr -> sr_state = CEPH_SPARSE_READ_DATA ;
5906
+ sr -> sr_state = CEPH_SPARSE_READ_DATA_PRE ;
5907
5907
break ;
5908
+ case CEPH_SPARSE_READ_DATA_PRE :
5909
+ /* Convert sr_datalen to host-endian */
5910
+ sr -> sr_datalen = le32_to_cpu ((__force __le32 )sr -> sr_datalen );
5911
+ for (i = 0 ; i < count ; i ++ )
5912
+ len += sr -> sr_extent [i ].len ;
5913
+ if (sr -> sr_datalen != len ) {
5914
+ pr_warn_ratelimited ("data len %u != extent len %llu\n" ,
5915
+ sr -> sr_datalen , len );
5916
+ return - EREMOTEIO ;
5917
+ }
5918
+ sr -> sr_state = CEPH_SPARSE_READ_DATA ;
5919
+ fallthrough ;
5908
5920
case CEPH_SPARSE_READ_DATA :
5909
5921
if (sr -> sr_index >= count ) {
5910
5922
sr -> sr_state = CEPH_SPARSE_READ_HDR ;
You can’t perform that action at this time.
0 commit comments