File tree Expand file tree Collapse file tree 1 file changed +45
-3
lines changed Expand file tree Collapse file tree 1 file changed +45
-3
lines changed Original file line number Diff line number Diff line change @@ -462,11 +462,34 @@ static const match_table_t ovl_tokens = {
462
462
{OPT_ERR , NULL }
463
463
};
464
464
465
+ static char * ovl_next_opt (char * * s )
466
+ {
467
+ char * sbegin = * s ;
468
+ char * p ;
469
+
470
+ if (sbegin == NULL )
471
+ return NULL ;
472
+
473
+ for (p = sbegin ; * p ; p ++ ) {
474
+ if (* p == '\\' ) {
475
+ p ++ ;
476
+ if (!* p )
477
+ break ;
478
+ } else if (* p == ',' ) {
479
+ * p = '\0' ;
480
+ * s = p + 1 ;
481
+ return sbegin ;
482
+ }
483
+ }
484
+ * s = NULL ;
485
+ return sbegin ;
486
+ }
487
+
465
488
static int ovl_parse_opt (char * opt , struct ovl_config * config )
466
489
{
467
490
char * p ;
468
491
469
- while ((p = strsep (& opt , "," )) != NULL ) {
492
+ while ((p = ovl_next_opt (& opt )) != NULL ) {
470
493
int token ;
471
494
substring_t args [MAX_OPT_ARGS ];
472
495
@@ -554,15 +577,34 @@ static struct dentry *ovl_workdir_create(struct vfsmount *mnt,
554
577
goto out_unlock ;
555
578
}
556
579
580
+ static void ovl_unescape (char * s )
581
+ {
582
+ char * d = s ;
583
+
584
+ for (;; s ++ , d ++ ) {
585
+ if (* s == '\\' )
586
+ s ++ ;
587
+ * d = * s ;
588
+ if (!* s )
589
+ break ;
590
+ }
591
+ }
592
+
557
593
static int ovl_mount_dir (const char * name , struct path * path )
558
594
{
559
595
int err ;
596
+ char * tmp = kstrdup (name , GFP_KERNEL );
597
+
598
+ if (!tmp )
599
+ return - ENOMEM ;
560
600
561
- err = kern_path (name , LOOKUP_FOLLOW , path );
601
+ ovl_unescape (tmp );
602
+ err = kern_path (tmp , LOOKUP_FOLLOW , path );
562
603
if (err ) {
563
- pr_err ("overlayfs: failed to resolve '%s': %i\n" , name , err );
604
+ pr_err ("overlayfs: failed to resolve '%s': %i\n" , tmp , err );
564
605
err = - EINVAL ;
565
606
}
607
+ kfree (tmp );
566
608
return err ;
567
609
}
568
610
You can’t perform that action at this time.
0 commit comments