File tree Expand file tree Collapse file tree 4 files changed +52
-14
lines changed Expand file tree Collapse file tree 4 files changed +52
-14
lines changed Original file line number Diff line number Diff line change @@ -419,6 +419,8 @@ static inline int bpf_map_attr_numa_node(const union bpf_attr *attr)
419
419
attr -> numa_node : NUMA_NO_NODE ;
420
420
}
421
421
422
+ struct bpf_prog * bpf_prog_get_type_path (const char * name , enum bpf_prog_type type );
423
+
422
424
#else /* !CONFIG_BPF_SYSCALL */
423
425
static inline struct bpf_prog * bpf_prog_get (u32 ufd )
424
426
{
@@ -506,6 +508,12 @@ static inline int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu,
506
508
{
507
509
return 0 ;
508
510
}
511
+
512
+ static inline struct bpf_prog * bpf_prog_get_type_path (const char * name ,
513
+ enum bpf_prog_type type )
514
+ {
515
+ return ERR_PTR (- EOPNOTSUPP );
516
+ }
509
517
#endif /* CONFIG_BPF_SYSCALL */
510
518
511
519
static inline struct bpf_prog * bpf_prog_get_type (u32 ufd ,
@@ -514,6 +522,8 @@ static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
514
522
return bpf_prog_get_type_dev (ufd , type , false);
515
523
}
516
524
525
+ bool bpf_prog_get_ok (struct bpf_prog * , enum bpf_prog_type * , bool );
526
+
517
527
int bpf_prog_offload_compile (struct bpf_prog * prog );
518
528
void bpf_prog_offload_destroy (struct bpf_prog * prog );
519
529
Original file line number Diff line number Diff line change @@ -368,7 +368,45 @@ int bpf_obj_get_user(const char __user *pathname, int flags)
368
368
putname (pname );
369
369
return ret ;
370
370
}
371
- EXPORT_SYMBOL_GPL (bpf_obj_get_user );
371
+
372
+ static struct bpf_prog * __get_prog_inode (struct inode * inode , enum bpf_prog_type type )
373
+ {
374
+ struct bpf_prog * prog ;
375
+ int ret = inode_permission (inode , MAY_READ | MAY_WRITE );
376
+ if (ret )
377
+ return ERR_PTR (ret );
378
+
379
+ if (inode -> i_op == & bpf_map_iops )
380
+ return ERR_PTR (- EINVAL );
381
+ if (inode -> i_op != & bpf_prog_iops )
382
+ return ERR_PTR (- EACCES );
383
+
384
+ prog = inode -> i_private ;
385
+
386
+ ret = security_bpf_prog (prog );
387
+ if (ret < 0 )
388
+ return ERR_PTR (ret );
389
+
390
+ if (!bpf_prog_get_ok (prog , & type , false))
391
+ return ERR_PTR (- EINVAL );
392
+
393
+ return bpf_prog_inc (prog );
394
+ }
395
+
396
+ struct bpf_prog * bpf_prog_get_type_path (const char * name , enum bpf_prog_type type )
397
+ {
398
+ struct bpf_prog * prog ;
399
+ struct path path ;
400
+ int ret = kern_path (name , LOOKUP_FOLLOW , & path );
401
+ if (ret )
402
+ return ERR_PTR (ret );
403
+ prog = __get_prog_inode (d_backing_inode (path .dentry ), type );
404
+ if (!IS_ERR (prog ))
405
+ touch_atime (& path );
406
+ path_put (& path );
407
+ return prog ;
408
+ }
409
+ EXPORT_SYMBOL (bpf_prog_get_type_path );
372
410
373
411
static void bpf_evict_inode (struct inode * inode )
374
412
{
Original file line number Diff line number Diff line change @@ -1057,7 +1057,7 @@ struct bpf_prog *bpf_prog_inc_not_zero(struct bpf_prog *prog)
1057
1057
}
1058
1058
EXPORT_SYMBOL_GPL (bpf_prog_inc_not_zero );
1059
1059
1060
- static bool bpf_prog_get_ok (struct bpf_prog * prog ,
1060
+ bool bpf_prog_get_ok (struct bpf_prog * prog ,
1061
1061
enum bpf_prog_type * attach_type , bool attach_drv )
1062
1062
{
1063
1063
/* not an attachment, just a refcount inc, always allow */
Original file line number Diff line number Diff line change @@ -52,18 +52,8 @@ static int __bpf_mt_check_fd(int fd, struct bpf_prog **ret)
52
52
53
53
static int __bpf_mt_check_path (const char * path , struct bpf_prog * * ret )
54
54
{
55
- mm_segment_t oldfs = get_fs ();
56
- int retval , fd ;
57
-
58
- set_fs (KERNEL_DS );
59
- fd = bpf_obj_get_user (path , 0 );
60
- set_fs (oldfs );
61
- if (fd < 0 )
62
- return fd ;
63
-
64
- retval = __bpf_mt_check_fd (fd , ret );
65
- sys_close (fd );
66
- return retval ;
55
+ * ret = bpf_prog_get_type_path (path , BPF_PROG_TYPE_SOCKET_FILTER );
56
+ return PTR_ERR_OR_ZERO (* ret );
67
57
}
68
58
69
59
static int bpf_mt_check (const struct xt_mtchk_param * par )
You can’t perform that action at this time.
0 commit comments