@@ -1967,7 +1967,7 @@ int smb2_tree_connect(struct ksmbd_work *work)
1967
1967
1968
1968
WORK_BUFFERS (work , req , rsp );
1969
1969
1970
- treename = smb_strndup_from_utf16 (req -> Buffer ,
1970
+ treename = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> PathOffset ) ,
1971
1971
le16_to_cpu (req -> PathLength ), true,
1972
1972
conn -> local_nls );
1973
1973
if (IS_ERR (treename )) {
@@ -2714,7 +2714,7 @@ int smb2_open(struct ksmbd_work *work)
2714
2714
goto err_out2 ;
2715
2715
}
2716
2716
2717
- name = smb2_get_name (req -> Buffer ,
2717
+ name = smb2_get_name (( char * ) req + le16_to_cpu ( req -> NameOffset ) ,
2718
2718
le16_to_cpu (req -> NameLength ),
2719
2719
work -> conn -> local_nls );
2720
2720
if (IS_ERR (name )) {
@@ -4086,7 +4086,7 @@ int smb2_query_dir(struct ksmbd_work *work)
4086
4086
}
4087
4087
4088
4088
srch_flag = req -> Flags ;
4089
- srch_ptr = smb_strndup_from_utf16 (req -> Buffer ,
4089
+ srch_ptr = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> FileNameOffset ) ,
4090
4090
le16_to_cpu (req -> FileNameLength ), 1 ,
4091
4091
conn -> local_nls );
4092
4092
if (IS_ERR (srch_ptr )) {
@@ -4346,7 +4346,8 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
4346
4346
sizeof (struct smb2_ea_info_req ))
4347
4347
return - EINVAL ;
4348
4348
4349
- ea_req = (struct smb2_ea_info_req * )req -> Buffer ;
4349
+ ea_req = (struct smb2_ea_info_req * )((char * )req +
4350
+ le16_to_cpu (req -> InputBufferOffset ));
4350
4351
} else {
4351
4352
/* need to send all EAs, if no specific EA is requested*/
4352
4353
if (le32_to_cpu (req -> Flags ) & SL_RETURN_SINGLE_ENTRY )
@@ -5952,38 +5953,39 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
5952
5953
struct ksmbd_share_config * share )
5953
5954
{
5954
5955
unsigned int buf_len = le32_to_cpu (req -> BufferLength );
5956
+ char * buffer = (char * )req + le16_to_cpu (req -> BufferOffset );
5955
5957
5956
5958
switch (req -> FileInfoClass ) {
5957
5959
case FILE_BASIC_INFORMATION :
5958
5960
{
5959
5961
if (buf_len < sizeof (struct smb2_file_basic_info ))
5960
5962
return - EINVAL ;
5961
5963
5962
- return set_file_basic_info (fp , (struct smb2_file_basic_info * )req -> Buffer , share );
5964
+ return set_file_basic_info (fp , (struct smb2_file_basic_info * )buffer , share );
5963
5965
}
5964
5966
case FILE_ALLOCATION_INFORMATION :
5965
5967
{
5966
5968
if (buf_len < sizeof (struct smb2_file_alloc_info ))
5967
5969
return - EINVAL ;
5968
5970
5969
5971
return set_file_allocation_info (work , fp ,
5970
- (struct smb2_file_alloc_info * )req -> Buffer );
5972
+ (struct smb2_file_alloc_info * )buffer );
5971
5973
}
5972
5974
case FILE_END_OF_FILE_INFORMATION :
5973
5975
{
5974
5976
if (buf_len < sizeof (struct smb2_file_eof_info ))
5975
5977
return - EINVAL ;
5976
5978
5977
5979
return set_end_of_file_info (work , fp ,
5978
- (struct smb2_file_eof_info * )req -> Buffer );
5980
+ (struct smb2_file_eof_info * )buffer );
5979
5981
}
5980
5982
case FILE_RENAME_INFORMATION :
5981
5983
{
5982
5984
if (buf_len < sizeof (struct smb2_file_rename_info ))
5983
5985
return - EINVAL ;
5984
5986
5985
5987
return set_rename_info (work , fp ,
5986
- (struct smb2_file_rename_info * )req -> Buffer ,
5988
+ (struct smb2_file_rename_info * )buffer ,
5987
5989
buf_len );
5988
5990
}
5989
5991
case FILE_LINK_INFORMATION :
@@ -5992,7 +5994,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
5992
5994
return - EINVAL ;
5993
5995
5994
5996
return smb2_create_link (work , work -> tcon -> share_conf ,
5995
- (struct smb2_file_link_info * )req -> Buffer ,
5997
+ (struct smb2_file_link_info * )buffer ,
5996
5998
buf_len , fp -> filp ,
5997
5999
work -> conn -> local_nls );
5998
6000
}
@@ -6002,7 +6004,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6002
6004
return - EINVAL ;
6003
6005
6004
6006
return set_file_disposition_info (fp ,
6005
- (struct smb2_file_disposition_info * )req -> Buffer );
6007
+ (struct smb2_file_disposition_info * )buffer );
6006
6008
}
6007
6009
case FILE_FULL_EA_INFORMATION :
6008
6010
{
@@ -6015,22 +6017,22 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6015
6017
if (buf_len < sizeof (struct smb2_ea_info ))
6016
6018
return - EINVAL ;
6017
6019
6018
- return smb2_set_ea ((struct smb2_ea_info * )req -> Buffer ,
6020
+ return smb2_set_ea ((struct smb2_ea_info * )buffer ,
6019
6021
buf_len , & fp -> filp -> f_path , true);
6020
6022
}
6021
6023
case FILE_POSITION_INFORMATION :
6022
6024
{
6023
6025
if (buf_len < sizeof (struct smb2_file_pos_info ))
6024
6026
return - EINVAL ;
6025
6027
6026
- return set_file_position_info (fp , (struct smb2_file_pos_info * )req -> Buffer );
6028
+ return set_file_position_info (fp , (struct smb2_file_pos_info * )buffer );
6027
6029
}
6028
6030
case FILE_MODE_INFORMATION :
6029
6031
{
6030
6032
if (buf_len < sizeof (struct smb2_file_mode_info ))
6031
6033
return - EINVAL ;
6032
6034
6033
- return set_file_mode_info (fp , (struct smb2_file_mode_info * )req -> Buffer );
6035
+ return set_file_mode_info (fp , (struct smb2_file_mode_info * )buffer );
6034
6036
}
6035
6037
}
6036
6038
@@ -6111,7 +6113,7 @@ int smb2_set_info(struct ksmbd_work *work)
6111
6113
}
6112
6114
rc = smb2_set_info_sec (fp ,
6113
6115
le32_to_cpu (req -> AdditionalInformation ),
6114
- req -> Buffer ,
6116
+ ( char * ) req + le16_to_cpu ( req -> BufferOffset ) ,
6115
6117
le32_to_cpu (req -> BufferLength ));
6116
6118
ksmbd_revert_fsids (work );
6117
6119
break ;
@@ -7563,7 +7565,7 @@ static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id,
7563
7565
struct smb2_ioctl_rsp * rsp )
7564
7566
{
7565
7567
struct ksmbd_rpc_command * rpc_resp ;
7566
- char * data_buf = (char * )& req -> Buffer [ 0 ] ;
7568
+ char * data_buf = (char * )req + le32_to_cpu ( req -> InputOffset ) ;
7567
7569
int nbytes = 0 ;
7568
7570
7569
7571
rpc_resp = ksmbd_rpc_ioctl (work -> sess , id , data_buf ,
@@ -7676,6 +7678,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7676
7678
u64 id = KSMBD_NO_FID ;
7677
7679
struct ksmbd_conn * conn = work -> conn ;
7678
7680
int ret = 0 ;
7681
+ char * buffer ;
7679
7682
7680
7683
if (work -> next_smb2_rcv_hdr_off ) {
7681
7684
req = ksmbd_req_buf_next (work );
@@ -7698,6 +7701,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7698
7701
goto out ;
7699
7702
}
7700
7703
7704
+ buffer = (char * )req + le32_to_cpu (req -> InputOffset );
7701
7705
cnt_code = le32_to_cpu (req -> CntCode );
7702
7706
ret = smb2_calc_max_out_buf_len (work , 48 ,
7703
7707
le32_to_cpu (req -> MaxOutputResponse ));
@@ -7755,7 +7759,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7755
7759
}
7756
7760
7757
7761
ret = fsctl_validate_negotiate_info (conn ,
7758
- (struct validate_negotiate_info_req * )& req -> Buffer [ 0 ] ,
7762
+ (struct validate_negotiate_info_req * )buffer ,
7759
7763
(struct validate_negotiate_info_rsp * )& rsp -> Buffer [0 ],
7760
7764
in_buf_len );
7761
7765
if (ret < 0 )
@@ -7808,7 +7812,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7808
7812
rsp -> VolatileFileId = req -> VolatileFileId ;
7809
7813
rsp -> PersistentFileId = req -> PersistentFileId ;
7810
7814
fsctl_copychunk (work ,
7811
- (struct copychunk_ioctl_req * )& req -> Buffer [ 0 ] ,
7815
+ (struct copychunk_ioctl_req * )buffer ,
7812
7816
le32_to_cpu (req -> CntCode ),
7813
7817
le32_to_cpu (req -> InputCount ),
7814
7818
req -> VolatileFileId ,
@@ -7821,8 +7825,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7821
7825
goto out ;
7822
7826
}
7823
7827
7824
- ret = fsctl_set_sparse (work , id ,
7825
- (struct file_sparse * )& req -> Buffer [0 ]);
7828
+ ret = fsctl_set_sparse (work , id , (struct file_sparse * )buffer );
7826
7829
if (ret < 0 )
7827
7830
goto out ;
7828
7831
break ;
@@ -7845,7 +7848,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7845
7848
}
7846
7849
7847
7850
zero_data =
7848
- (struct file_zero_data_information * )& req -> Buffer [ 0 ] ;
7851
+ (struct file_zero_data_information * )buffer ;
7849
7852
7850
7853
off = le64_to_cpu (zero_data -> FileOffset );
7851
7854
bfz = le64_to_cpu (zero_data -> BeyondFinalZero );
@@ -7876,7 +7879,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7876
7879
}
7877
7880
7878
7881
ret = fsctl_query_allocated_ranges (work , id ,
7879
- (struct file_allocated_range_buffer * )& req -> Buffer [ 0 ] ,
7882
+ (struct file_allocated_range_buffer * )buffer ,
7880
7883
(struct file_allocated_range_buffer * )& rsp -> Buffer [0 ],
7881
7884
out_buf_len /
7882
7885
sizeof (struct file_allocated_range_buffer ), & nbytes );
@@ -7920,7 +7923,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7920
7923
goto out ;
7921
7924
}
7922
7925
7923
- dup_ext = (struct duplicate_extents_to_file * )& req -> Buffer [ 0 ] ;
7926
+ dup_ext = (struct duplicate_extents_to_file * )buffer ;
7924
7927
7925
7928
fp_in = ksmbd_lookup_fd_slow (work , dup_ext -> VolatileFileHandle ,
7926
7929
dup_ext -> PersistentFileHandle );
0 commit comments