@@ -1927,7 +1927,7 @@ int smb2_tree_connect(struct ksmbd_work *work)
1927
1927
1928
1928
WORK_BUFFERS (work , req , rsp );
1929
1929
1930
- treename = smb_strndup_from_utf16 (req -> Buffer ,
1930
+ treename = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> PathOffset ) ,
1931
1931
le16_to_cpu (req -> PathLength ), true,
1932
1932
conn -> local_nls );
1933
1933
if (IS_ERR (treename )) {
@@ -2840,7 +2840,7 @@ int smb2_open(struct ksmbd_work *work)
2840
2840
goto err_out2 ;
2841
2841
}
2842
2842
2843
- name = smb2_get_name (req -> Buffer ,
2843
+ name = smb2_get_name (( char * ) req + le16_to_cpu ( req -> NameOffset ) ,
2844
2844
le16_to_cpu (req -> NameLength ),
2845
2845
work -> conn -> local_nls );
2846
2846
if (IS_ERR (name )) {
@@ -4305,7 +4305,7 @@ int smb2_query_dir(struct ksmbd_work *work)
4305
4305
}
4306
4306
4307
4307
srch_flag = req -> Flags ;
4308
- srch_ptr = smb_strndup_from_utf16 (req -> Buffer ,
4308
+ srch_ptr = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> FileNameOffset ) ,
4309
4309
le16_to_cpu (req -> FileNameLength ), 1 ,
4310
4310
conn -> local_nls );
4311
4311
if (IS_ERR (srch_ptr )) {
@@ -4565,7 +4565,8 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
4565
4565
sizeof (struct smb2_ea_info_req ))
4566
4566
return - EINVAL ;
4567
4567
4568
- ea_req = (struct smb2_ea_info_req * )req -> Buffer ;
4568
+ ea_req = (struct smb2_ea_info_req * )((char * )req +
4569
+ le16_to_cpu (req -> InputBufferOffset ));
4569
4570
} else {
4570
4571
/* need to send all EAs, if no specific EA is requested*/
4571
4572
if (le32_to_cpu (req -> Flags ) & SL_RETURN_SINGLE_ENTRY )
@@ -6211,38 +6212,39 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6211
6212
struct ksmbd_share_config * share )
6212
6213
{
6213
6214
unsigned int buf_len = le32_to_cpu (req -> BufferLength );
6215
+ char * buffer = (char * )req + le16_to_cpu (req -> BufferOffset );
6214
6216
6215
6217
switch (req -> FileInfoClass ) {
6216
6218
case FILE_BASIC_INFORMATION :
6217
6219
{
6218
6220
if (buf_len < sizeof (struct smb2_file_basic_info ))
6219
6221
return - EINVAL ;
6220
6222
6221
- return set_file_basic_info (fp , (struct smb2_file_basic_info * )req -> Buffer , share );
6223
+ return set_file_basic_info (fp , (struct smb2_file_basic_info * )buffer , share );
6222
6224
}
6223
6225
case FILE_ALLOCATION_INFORMATION :
6224
6226
{
6225
6227
if (buf_len < sizeof (struct smb2_file_alloc_info ))
6226
6228
return - EINVAL ;
6227
6229
6228
6230
return set_file_allocation_info (work , fp ,
6229
- (struct smb2_file_alloc_info * )req -> Buffer );
6231
+ (struct smb2_file_alloc_info * )buffer );
6230
6232
}
6231
6233
case FILE_END_OF_FILE_INFORMATION :
6232
6234
{
6233
6235
if (buf_len < sizeof (struct smb2_file_eof_info ))
6234
6236
return - EINVAL ;
6235
6237
6236
6238
return set_end_of_file_info (work , fp ,
6237
- (struct smb2_file_eof_info * )req -> Buffer );
6239
+ (struct smb2_file_eof_info * )buffer );
6238
6240
}
6239
6241
case FILE_RENAME_INFORMATION :
6240
6242
{
6241
6243
if (buf_len < sizeof (struct smb2_file_rename_info ))
6242
6244
return - EINVAL ;
6243
6245
6244
6246
return set_rename_info (work , fp ,
6245
- (struct smb2_file_rename_info * )req -> Buffer ,
6247
+ (struct smb2_file_rename_info * )buffer ,
6246
6248
buf_len );
6247
6249
}
6248
6250
case FILE_LINK_INFORMATION :
@@ -6251,7 +6253,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6251
6253
return - EINVAL ;
6252
6254
6253
6255
return smb2_create_link (work , work -> tcon -> share_conf ,
6254
- (struct smb2_file_link_info * )req -> Buffer ,
6256
+ (struct smb2_file_link_info * )buffer ,
6255
6257
buf_len , fp -> filp ,
6256
6258
work -> conn -> local_nls );
6257
6259
}
@@ -6261,7 +6263,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6261
6263
return - EINVAL ;
6262
6264
6263
6265
return set_file_disposition_info (fp ,
6264
- (struct smb2_file_disposition_info * )req -> Buffer );
6266
+ (struct smb2_file_disposition_info * )buffer );
6265
6267
}
6266
6268
case FILE_FULL_EA_INFORMATION :
6267
6269
{
@@ -6274,22 +6276,22 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6274
6276
if (buf_len < sizeof (struct smb2_ea_info ))
6275
6277
return - EINVAL ;
6276
6278
6277
- return smb2_set_ea ((struct smb2_ea_info * )req -> Buffer ,
6279
+ return smb2_set_ea ((struct smb2_ea_info * )buffer ,
6278
6280
buf_len , & fp -> filp -> f_path , true);
6279
6281
}
6280
6282
case FILE_POSITION_INFORMATION :
6281
6283
{
6282
6284
if (buf_len < sizeof (struct smb2_file_pos_info ))
6283
6285
return - EINVAL ;
6284
6286
6285
- return set_file_position_info (fp , (struct smb2_file_pos_info * )req -> Buffer );
6287
+ return set_file_position_info (fp , (struct smb2_file_pos_info * )buffer );
6286
6288
}
6287
6289
case FILE_MODE_INFORMATION :
6288
6290
{
6289
6291
if (buf_len < sizeof (struct smb2_file_mode_info ))
6290
6292
return - EINVAL ;
6291
6293
6292
- return set_file_mode_info (fp , (struct smb2_file_mode_info * )req -> Buffer );
6294
+ return set_file_mode_info (fp , (struct smb2_file_mode_info * )buffer );
6293
6295
}
6294
6296
}
6295
6297
@@ -6370,7 +6372,7 @@ int smb2_set_info(struct ksmbd_work *work)
6370
6372
}
6371
6373
rc = smb2_set_info_sec (fp ,
6372
6374
le32_to_cpu (req -> AdditionalInformation ),
6373
- req -> Buffer ,
6375
+ ( char * ) req + le16_to_cpu ( req -> BufferOffset ) ,
6374
6376
le32_to_cpu (req -> BufferLength ));
6375
6377
ksmbd_revert_fsids (work );
6376
6378
break ;
@@ -7816,7 +7818,7 @@ static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id,
7816
7818
struct smb2_ioctl_rsp * rsp )
7817
7819
{
7818
7820
struct ksmbd_rpc_command * rpc_resp ;
7819
- char * data_buf = (char * )& req -> Buffer [ 0 ] ;
7821
+ char * data_buf = (char * )req + le32_to_cpu ( req -> InputOffset ) ;
7820
7822
int nbytes = 0 ;
7821
7823
7822
7824
rpc_resp = ksmbd_rpc_ioctl (work -> sess , id , data_buf ,
@@ -7929,6 +7931,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7929
7931
u64 id = KSMBD_NO_FID ;
7930
7932
struct ksmbd_conn * conn = work -> conn ;
7931
7933
int ret = 0 ;
7934
+ char * buffer ;
7932
7935
7933
7936
if (work -> next_smb2_rcv_hdr_off ) {
7934
7937
req = ksmbd_req_buf_next (work );
@@ -7951,6 +7954,8 @@ int smb2_ioctl(struct ksmbd_work *work)
7951
7954
goto out ;
7952
7955
}
7953
7956
7957
+ buffer = (char * )req + le32_to_cpu (req -> InputOffset );
7958
+
7954
7959
cnt_code = le32_to_cpu (req -> CtlCode );
7955
7960
ret = smb2_calc_max_out_buf_len (work , 48 ,
7956
7961
le32_to_cpu (req -> MaxOutputResponse ));
@@ -8008,7 +8013,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8008
8013
}
8009
8014
8010
8015
ret = fsctl_validate_negotiate_info (conn ,
8011
- (struct validate_negotiate_info_req * )& req -> Buffer [ 0 ] ,
8016
+ (struct validate_negotiate_info_req * )buffer ,
8012
8017
(struct validate_negotiate_info_rsp * )& rsp -> Buffer [0 ],
8013
8018
in_buf_len );
8014
8019
if (ret < 0 )
@@ -8061,7 +8066,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8061
8066
rsp -> VolatileFileId = req -> VolatileFileId ;
8062
8067
rsp -> PersistentFileId = req -> PersistentFileId ;
8063
8068
fsctl_copychunk (work ,
8064
- (struct copychunk_ioctl_req * )& req -> Buffer [ 0 ] ,
8069
+ (struct copychunk_ioctl_req * )buffer ,
8065
8070
le32_to_cpu (req -> CtlCode ),
8066
8071
le32_to_cpu (req -> InputCount ),
8067
8072
req -> VolatileFileId ,
@@ -8074,8 +8079,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8074
8079
goto out ;
8075
8080
}
8076
8081
8077
- ret = fsctl_set_sparse (work , id ,
8078
- (struct file_sparse * )& req -> Buffer [0 ]);
8082
+ ret = fsctl_set_sparse (work , id , (struct file_sparse * )buffer );
8079
8083
if (ret < 0 )
8080
8084
goto out ;
8081
8085
break ;
@@ -8098,7 +8102,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8098
8102
}
8099
8103
8100
8104
zero_data =
8101
- (struct file_zero_data_information * )& req -> Buffer [ 0 ] ;
8105
+ (struct file_zero_data_information * )buffer ;
8102
8106
8103
8107
off = le64_to_cpu (zero_data -> FileOffset );
8104
8108
bfz = le64_to_cpu (zero_data -> BeyondFinalZero );
@@ -8129,7 +8133,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8129
8133
}
8130
8134
8131
8135
ret = fsctl_query_allocated_ranges (work , id ,
8132
- (struct file_allocated_range_buffer * )& req -> Buffer [ 0 ] ,
8136
+ (struct file_allocated_range_buffer * )buffer ,
8133
8137
(struct file_allocated_range_buffer * )& rsp -> Buffer [0 ],
8134
8138
out_buf_len /
8135
8139
sizeof (struct file_allocated_range_buffer ), & nbytes );
@@ -8173,7 +8177,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8173
8177
goto out ;
8174
8178
}
8175
8179
8176
- dup_ext = (struct duplicate_extents_to_file * )& req -> Buffer [ 0 ] ;
8180
+ dup_ext = (struct duplicate_extents_to_file * )buffer ;
8177
8181
8178
8182
fp_in = ksmbd_lookup_fd_slow (work , dup_ext -> VolatileFileHandle ,
8179
8183
dup_ext -> PersistentFileHandle );
0 commit comments