@@ -634,31 +634,17 @@ static char *
634
634
smb2_get_name (struct ksmbd_share_config * share , const char * src ,
635
635
const int maxlen , struct nls_table * local_nls )
636
636
{
637
- char * name , * norm_name , * unixname ;
637
+ char * name ;
638
638
639
639
name = smb_strndup_from_utf16 (src , maxlen , 1 , local_nls );
640
640
if (IS_ERR (name )) {
641
641
pr_err ("failed to get name %ld\n" , PTR_ERR (name ));
642
642
return name ;
643
643
}
644
644
645
- /* change it to absolute unix name */
646
- norm_name = ksmbd_conv_path_to_unix (name );
647
- if (IS_ERR (norm_name )) {
648
- kfree (name );
649
- return norm_name ;
650
- }
651
- kfree (name );
652
-
653
- unixname = convert_to_unix_name (share , norm_name );
654
- kfree (norm_name );
655
- if (!unixname ) {
656
- pr_err ("can not convert absolute name\n" );
657
- return ERR_PTR (- ENOMEM );
658
- }
659
-
660
- ksmbd_debug (SMB , "absolute name = %s\n" , unixname );
661
- return unixname ;
645
+ ksmbd_conv_path_to_unix (name );
646
+ ksmbd_strip_last_slash (name );
647
+ return name ;
662
648
}
663
649
664
650
int setup_async_work (struct ksmbd_work * work , void (* fn )(void * * ), void * * arg )
@@ -2352,7 +2338,7 @@ static int smb2_creat(struct ksmbd_work *work, struct path *path, char *name,
2352
2338
return rc ;
2353
2339
}
2354
2340
2355
- rc = ksmbd_vfs_kern_path (name , 0 , path , 0 );
2341
+ rc = ksmbd_vfs_kern_path (work , name , 0 , path , 0 );
2356
2342
if (rc ) {
2357
2343
pr_err ("cannot get linux path (%s), err = %d\n" ,
2358
2344
name , rc );
@@ -2427,7 +2413,7 @@ int smb2_open(struct ksmbd_work *work)
2427
2413
struct oplock_info * opinfo ;
2428
2414
__le32 * next_ptr = NULL ;
2429
2415
int req_op_level = 0 , open_flags = 0 , may_flags = 0 , file_info = 0 ;
2430
- int rc = 0 , len = 0 ;
2416
+ int rc = 0 ;
2431
2417
int contxt_cnt = 0 , query_disk_id = 0 ;
2432
2418
int maximal_access_ctxt = 0 , posix_ctxt = 0 ;
2433
2419
int s_type = 0 ;
@@ -2499,17 +2485,11 @@ int smb2_open(struct ksmbd_work *work)
2499
2485
goto err_out1 ;
2500
2486
}
2501
2487
} else {
2502
- len = strlen (share -> path );
2503
- ksmbd_debug (SMB , "share path len %d\n" , len );
2504
- name = kmalloc (len + 1 , GFP_KERNEL );
2488
+ name = kstrdup ("" , GFP_KERNEL );
2505
2489
if (!name ) {
2506
- rsp -> hdr .Status = STATUS_NO_MEMORY ;
2507
2490
rc = - ENOMEM ;
2508
2491
goto err_out1 ;
2509
2492
}
2510
-
2511
- memcpy (name , share -> path , len );
2512
- * (name + len ) = '\0' ;
2513
2493
}
2514
2494
2515
2495
req_op_level = req -> RequestedOplockLevel ;
@@ -2632,7 +2612,7 @@ int smb2_open(struct ksmbd_work *work)
2632
2612
goto err_out1 ;
2633
2613
}
2634
2614
2635
- rc = ksmbd_vfs_kern_path (name , LOOKUP_NO_SYMLINKS , & path , 1 );
2615
+ rc = ksmbd_vfs_kern_path (work , name , LOOKUP_NO_SYMLINKS , & path , 1 );
2636
2616
if (!rc ) {
2637
2617
if (req -> CreateOptions & FILE_DELETE_ON_CLOSE_LE ) {
2638
2618
/*
@@ -2661,11 +2641,8 @@ int smb2_open(struct ksmbd_work *work)
2661
2641
}
2662
2642
2663
2643
if (rc ) {
2664
- if (rc == - EACCES ) {
2665
- ksmbd_debug (SMB ,
2666
- "User does not have right permission\n" );
2644
+ if (rc != - ENOENT )
2667
2645
goto err_out ;
2668
- }
2669
2646
ksmbd_debug (SMB , "can not get linux path for %s, rc = %d\n" ,
2670
2647
name , rc );
2671
2648
rc = 0 ;
@@ -3161,7 +3138,7 @@ int smb2_open(struct ksmbd_work *work)
3161
3138
rsp -> hdr .Status = STATUS_INVALID_PARAMETER ;
3162
3139
else if (rc == - EOPNOTSUPP )
3163
3140
rsp -> hdr .Status = STATUS_NOT_SUPPORTED ;
3164
- else if (rc == - EACCES || rc == - ESTALE )
3141
+ else if (rc == - EACCES || rc == - ESTALE || rc == - EXDEV )
3165
3142
rsp -> hdr .Status = STATUS_ACCESS_DENIED ;
3166
3143
else if (rc == - ENOENT )
3167
3144
rsp -> hdr .Status = STATUS_OBJECT_NAME_INVALID ;
@@ -4277,8 +4254,7 @@ static int get_file_all_info(struct ksmbd_work *work,
4277
4254
return - EACCES ;
4278
4255
}
4279
4256
4280
- filename = convert_to_nt_pathname (fp -> filename ,
4281
- work -> tcon -> share_conf -> path );
4257
+ filename = convert_to_nt_pathname (fp -> filename );
4282
4258
if (!filename )
4283
4259
return - ENOMEM ;
4284
4260
@@ -4733,7 +4709,7 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
4733
4709
int rc = 0 , len ;
4734
4710
int fs_infoclass_size = 0 ;
4735
4711
4736
- rc = ksmbd_vfs_kern_path (share -> path , LOOKUP_NO_SYMLINKS , & path , 0 );
4712
+ rc = kern_path (share -> path , LOOKUP_NO_SYMLINKS , & path );
4737
4713
if (rc ) {
4738
4714
pr_err ("cannot create vfs path\n" );
4739
4715
return - EIO ;
@@ -5282,7 +5258,7 @@ static int smb2_rename(struct ksmbd_work *work,
5282
5258
goto out ;
5283
5259
5284
5260
len = strlen (new_name );
5285
- if (new_name [len - 1 ] != '/' ) {
5261
+ if (len > 0 && new_name [len - 1 ] != '/' ) {
5286
5262
pr_err ("not allow base filename in rename\n" );
5287
5263
rc = - ESHARE ;
5288
5264
goto out ;
@@ -5310,11 +5286,14 @@ static int smb2_rename(struct ksmbd_work *work,
5310
5286
}
5311
5287
5312
5288
ksmbd_debug (SMB , "new name %s\n" , new_name );
5313
- rc = ksmbd_vfs_kern_path (new_name , LOOKUP_NO_SYMLINKS , & path , 1 );
5314
- if (rc )
5289
+ rc = ksmbd_vfs_kern_path (work , new_name , LOOKUP_NO_SYMLINKS , & path , 1 );
5290
+ if (rc ) {
5291
+ if (rc != - ENOENT )
5292
+ goto out ;
5315
5293
file_present = false;
5316
- else
5294
+ } else {
5317
5295
path_put (& path );
5296
+ }
5318
5297
5319
5298
if (ksmbd_share_veto_filename (share , new_name )) {
5320
5299
rc = - ENOENT ;
@@ -5384,11 +5363,14 @@ static int smb2_create_link(struct ksmbd_work *work,
5384
5363
}
5385
5364
5386
5365
ksmbd_debug (SMB , "target name is %s\n" , target_name );
5387
- rc = ksmbd_vfs_kern_path (link_name , LOOKUP_NO_SYMLINKS , & path , 0 );
5388
- if (rc )
5366
+ rc = ksmbd_vfs_kern_path (work , link_name , LOOKUP_NO_SYMLINKS , & path , 0 );
5367
+ if (rc ) {
5368
+ if (rc != - ENOENT )
5369
+ goto out ;
5389
5370
file_present = false;
5390
- else
5371
+ } else {
5391
5372
path_put (& path );
5373
+ }
5392
5374
5393
5375
if (file_info -> ReplaceIfExists ) {
5394
5376
if (file_present ) {
@@ -5548,7 +5530,7 @@ static int set_file_allocation_info(struct ksmbd_work *work,
5548
5530
* inode size is retained by backup inode size.
5549
5531
*/
5550
5532
size = i_size_read (inode );
5551
- rc = ksmbd_vfs_truncate (work , NULL , fp , alloc_blks * 512 );
5533
+ rc = ksmbd_vfs_truncate (work , fp , alloc_blks * 512 );
5552
5534
if (rc ) {
5553
5535
pr_err ("truncate failed! filename : %s, err %d\n" ,
5554
5536
fp -> filename , rc );
@@ -5585,7 +5567,7 @@ static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp,
5585
5567
if (inode -> i_sb -> s_magic != MSDOS_SUPER_MAGIC ) {
5586
5568
ksmbd_debug (SMB , "filename : %s truncated to newsize %lld\n" ,
5587
5569
fp -> filename , newsize );
5588
- rc = ksmbd_vfs_truncate (work , NULL , fp , newsize );
5570
+ rc = ksmbd_vfs_truncate (work , fp , newsize );
5589
5571
if (rc ) {
5590
5572
ksmbd_debug (SMB , "truncate failed! filename : %s err %d\n" ,
5591
5573
fp -> filename , rc );
@@ -5862,7 +5844,7 @@ int smb2_set_info(struct ksmbd_work *work)
5862
5844
return 0 ;
5863
5845
5864
5846
err_out :
5865
- if (rc == - EACCES || rc == - EPERM )
5847
+ if (rc == - EACCES || rc == - EPERM || rc == - EXDEV )
5866
5848
rsp -> hdr .Status = STATUS_ACCESS_DENIED ;
5867
5849
else if (rc == - EINVAL )
5868
5850
rsp -> hdr .Status = STATUS_INVALID_PARAMETER ;
0 commit comments