@@ -1931,7 +1931,7 @@ int smb2_tree_connect(struct ksmbd_work *work)
1931
1931
1932
1932
WORK_BUFFERS (work , req , rsp );
1933
1933
1934
- treename = smb_strndup_from_utf16 (req -> Buffer ,
1934
+ treename = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> PathOffset ) ,
1935
1935
le16_to_cpu (req -> PathLength ), true,
1936
1936
conn -> local_nls );
1937
1937
if (IS_ERR (treename )) {
@@ -2844,7 +2844,7 @@ int smb2_open(struct ksmbd_work *work)
2844
2844
goto err_out2 ;
2845
2845
}
2846
2846
2847
- name = smb2_get_name (req -> Buffer ,
2847
+ name = smb2_get_name (( char * ) req + le16_to_cpu ( req -> NameOffset ) ,
2848
2848
le16_to_cpu (req -> NameLength ),
2849
2849
work -> conn -> local_nls );
2850
2850
if (IS_ERR (name )) {
@@ -4309,7 +4309,7 @@ int smb2_query_dir(struct ksmbd_work *work)
4309
4309
}
4310
4310
4311
4311
srch_flag = req -> Flags ;
4312
- srch_ptr = smb_strndup_from_utf16 (req -> Buffer ,
4312
+ srch_ptr = smb_strndup_from_utf16 (( char * ) req + le16_to_cpu ( req -> FileNameOffset ) ,
4313
4313
le16_to_cpu (req -> FileNameLength ), 1 ,
4314
4314
conn -> local_nls );
4315
4315
if (IS_ERR (srch_ptr )) {
@@ -4569,7 +4569,8 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
4569
4569
sizeof (struct smb2_ea_info_req ))
4570
4570
return - EINVAL ;
4571
4571
4572
- ea_req = (struct smb2_ea_info_req * )req -> Buffer ;
4572
+ ea_req = (struct smb2_ea_info_req * )((char * )req +
4573
+ le16_to_cpu (req -> InputBufferOffset ));
4573
4574
} else {
4574
4575
/* need to send all EAs, if no specific EA is requested*/
4575
4576
if (le32_to_cpu (req -> Flags ) & SL_RETURN_SINGLE_ENTRY )
@@ -6216,38 +6217,39 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6216
6217
struct ksmbd_share_config * share )
6217
6218
{
6218
6219
unsigned int buf_len = le32_to_cpu (req -> BufferLength );
6220
+ char * buffer = (char * )req + le16_to_cpu (req -> BufferOffset );
6219
6221
6220
6222
switch (req -> FileInfoClass ) {
6221
6223
case FILE_BASIC_INFORMATION :
6222
6224
{
6223
6225
if (buf_len < sizeof (struct smb2_file_basic_info ))
6224
6226
return - EINVAL ;
6225
6227
6226
- return set_file_basic_info (fp , (struct smb2_file_basic_info * )req -> Buffer , share );
6228
+ return set_file_basic_info (fp , (struct smb2_file_basic_info * )buffer , share );
6227
6229
}
6228
6230
case FILE_ALLOCATION_INFORMATION :
6229
6231
{
6230
6232
if (buf_len < sizeof (struct smb2_file_alloc_info ))
6231
6233
return - EINVAL ;
6232
6234
6233
6235
return set_file_allocation_info (work , fp ,
6234
- (struct smb2_file_alloc_info * )req -> Buffer );
6236
+ (struct smb2_file_alloc_info * )buffer );
6235
6237
}
6236
6238
case FILE_END_OF_FILE_INFORMATION :
6237
6239
{
6238
6240
if (buf_len < sizeof (struct smb2_file_eof_info ))
6239
6241
return - EINVAL ;
6240
6242
6241
6243
return set_end_of_file_info (work , fp ,
6242
- (struct smb2_file_eof_info * )req -> Buffer );
6244
+ (struct smb2_file_eof_info * )buffer );
6243
6245
}
6244
6246
case FILE_RENAME_INFORMATION :
6245
6247
{
6246
6248
if (buf_len < sizeof (struct smb2_file_rename_info ))
6247
6249
return - EINVAL ;
6248
6250
6249
6251
return set_rename_info (work , fp ,
6250
- (struct smb2_file_rename_info * )req -> Buffer ,
6252
+ (struct smb2_file_rename_info * )buffer ,
6251
6253
buf_len );
6252
6254
}
6253
6255
case FILE_LINK_INFORMATION :
@@ -6256,7 +6258,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6256
6258
return - EINVAL ;
6257
6259
6258
6260
return smb2_create_link (work , work -> tcon -> share_conf ,
6259
- (struct smb2_file_link_info * )req -> Buffer ,
6261
+ (struct smb2_file_link_info * )buffer ,
6260
6262
buf_len , fp -> filp ,
6261
6263
work -> conn -> local_nls );
6262
6264
}
@@ -6266,7 +6268,7 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6266
6268
return - EINVAL ;
6267
6269
6268
6270
return set_file_disposition_info (fp ,
6269
- (struct smb2_file_disposition_info * )req -> Buffer );
6271
+ (struct smb2_file_disposition_info * )buffer );
6270
6272
}
6271
6273
case FILE_FULL_EA_INFORMATION :
6272
6274
{
@@ -6279,22 +6281,22 @@ static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp,
6279
6281
if (buf_len < sizeof (struct smb2_ea_info ))
6280
6282
return - EINVAL ;
6281
6283
6282
- return smb2_set_ea ((struct smb2_ea_info * )req -> Buffer ,
6284
+ return smb2_set_ea ((struct smb2_ea_info * )buffer ,
6283
6285
buf_len , & fp -> filp -> f_path , true);
6284
6286
}
6285
6287
case FILE_POSITION_INFORMATION :
6286
6288
{
6287
6289
if (buf_len < sizeof (struct smb2_file_pos_info ))
6288
6290
return - EINVAL ;
6289
6291
6290
- return set_file_position_info (fp , (struct smb2_file_pos_info * )req -> Buffer );
6292
+ return set_file_position_info (fp , (struct smb2_file_pos_info * )buffer );
6291
6293
}
6292
6294
case FILE_MODE_INFORMATION :
6293
6295
{
6294
6296
if (buf_len < sizeof (struct smb2_file_mode_info ))
6295
6297
return - EINVAL ;
6296
6298
6297
- return set_file_mode_info (fp , (struct smb2_file_mode_info * )req -> Buffer );
6299
+ return set_file_mode_info (fp , (struct smb2_file_mode_info * )buffer );
6298
6300
}
6299
6301
}
6300
6302
@@ -6375,7 +6377,7 @@ int smb2_set_info(struct ksmbd_work *work)
6375
6377
}
6376
6378
rc = smb2_set_info_sec (fp ,
6377
6379
le32_to_cpu (req -> AdditionalInformation ),
6378
- req -> Buffer ,
6380
+ ( char * ) req + le16_to_cpu ( req -> BufferOffset ) ,
6379
6381
le32_to_cpu (req -> BufferLength ));
6380
6382
ksmbd_revert_fsids (work );
6381
6383
break ;
@@ -7821,7 +7823,7 @@ static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id,
7821
7823
struct smb2_ioctl_rsp * rsp )
7822
7824
{
7823
7825
struct ksmbd_rpc_command * rpc_resp ;
7824
- char * data_buf = (char * )& req -> Buffer [ 0 ] ;
7826
+ char * data_buf = (char * )req + le32_to_cpu ( req -> InputOffset ) ;
7825
7827
int nbytes = 0 ;
7826
7828
7827
7829
rpc_resp = ksmbd_rpc_ioctl (work -> sess , id , data_buf ,
@@ -7934,6 +7936,7 @@ int smb2_ioctl(struct ksmbd_work *work)
7934
7936
u64 id = KSMBD_NO_FID ;
7935
7937
struct ksmbd_conn * conn = work -> conn ;
7936
7938
int ret = 0 ;
7939
+ char * buffer ;
7937
7940
7938
7941
if (work -> next_smb2_rcv_hdr_off ) {
7939
7942
req = ksmbd_req_buf_next (work );
@@ -7956,6 +7959,8 @@ int smb2_ioctl(struct ksmbd_work *work)
7956
7959
goto out ;
7957
7960
}
7958
7961
7962
+ buffer = (char * )req + le32_to_cpu (req -> InputOffset );
7963
+
7959
7964
cnt_code = le32_to_cpu (req -> CtlCode );
7960
7965
ret = smb2_calc_max_out_buf_len (work , 48 ,
7961
7966
le32_to_cpu (req -> MaxOutputResponse ));
@@ -8013,7 +8018,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8013
8018
}
8014
8019
8015
8020
ret = fsctl_validate_negotiate_info (conn ,
8016
- (struct validate_negotiate_info_req * )& req -> Buffer [ 0 ] ,
8021
+ (struct validate_negotiate_info_req * )buffer ,
8017
8022
(struct validate_negotiate_info_rsp * )& rsp -> Buffer [0 ],
8018
8023
in_buf_len );
8019
8024
if (ret < 0 )
@@ -8066,7 +8071,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8066
8071
rsp -> VolatileFileId = req -> VolatileFileId ;
8067
8072
rsp -> PersistentFileId = req -> PersistentFileId ;
8068
8073
fsctl_copychunk (work ,
8069
- (struct copychunk_ioctl_req * )& req -> Buffer [ 0 ] ,
8074
+ (struct copychunk_ioctl_req * )buffer ,
8070
8075
le32_to_cpu (req -> CtlCode ),
8071
8076
le32_to_cpu (req -> InputCount ),
8072
8077
req -> VolatileFileId ,
@@ -8079,8 +8084,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8079
8084
goto out ;
8080
8085
}
8081
8086
8082
- ret = fsctl_set_sparse (work , id ,
8083
- (struct file_sparse * )& req -> Buffer [0 ]);
8087
+ ret = fsctl_set_sparse (work , id , (struct file_sparse * )buffer );
8084
8088
if (ret < 0 )
8085
8089
goto out ;
8086
8090
break ;
@@ -8103,7 +8107,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8103
8107
}
8104
8108
8105
8109
zero_data =
8106
- (struct file_zero_data_information * )& req -> Buffer [ 0 ] ;
8110
+ (struct file_zero_data_information * )buffer ;
8107
8111
8108
8112
off = le64_to_cpu (zero_data -> FileOffset );
8109
8113
bfz = le64_to_cpu (zero_data -> BeyondFinalZero );
@@ -8134,7 +8138,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8134
8138
}
8135
8139
8136
8140
ret = fsctl_query_allocated_ranges (work , id ,
8137
- (struct file_allocated_range_buffer * )& req -> Buffer [ 0 ] ,
8141
+ (struct file_allocated_range_buffer * )buffer ,
8138
8142
(struct file_allocated_range_buffer * )& rsp -> Buffer [0 ],
8139
8143
out_buf_len /
8140
8144
sizeof (struct file_allocated_range_buffer ), & nbytes );
@@ -8178,7 +8182,7 @@ int smb2_ioctl(struct ksmbd_work *work)
8178
8182
goto out ;
8179
8183
}
8180
8184
8181
- dup_ext = (struct duplicate_extents_to_file * )& req -> Buffer [ 0 ] ;
8185
+ dup_ext = (struct duplicate_extents_to_file * )buffer ;
8182
8186
8183
8187
fp_in = ksmbd_lookup_fd_slow (work , dup_ext -> VolatileFileHandle ,
8184
8188
dup_ext -> PersistentFileHandle );
0 commit comments