@@ -10913,60 +10913,45 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,
10913
10913
static int attach_uprobe (const struct bpf_program * prog , long cookie , struct bpf_link * * link )
10914
10914
{
10915
10915
DECLARE_LIBBPF_OPTS (bpf_uprobe_opts , opts );
10916
- char * func , * probe_name , * func_end ;
10917
- char * func_name , binary_path [512 ];
10918
- unsigned long long raw_offset ;
10919
- size_t offset = 0 ;
10920
- int n ;
10916
+ char * probe_type = NULL , * binary_path = NULL , * func_name = NULL ;
10917
+ int n , ret = - EINVAL ;
10918
+ long offset = 0 ;
10921
10919
10922
10920
* link = NULL ;
10923
10921
10924
- opts .retprobe = str_has_pfx (prog -> sec_name , "uretprobe" );
10925
- if (opts .retprobe )
10926
- probe_name = prog -> sec_name + sizeof ("uretprobe" ) - 1 ;
10927
- else
10928
- probe_name = prog -> sec_name + sizeof ("uprobe" ) - 1 ;
10929
- if (probe_name [0 ] == '/' )
10930
- probe_name ++ ;
10931
-
10932
- /* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */
10933
- if (strlen (probe_name ) == 0 )
10934
- return 0 ;
10935
-
10936
- snprintf (binary_path , sizeof (binary_path ), "%s" , probe_name );
10937
- /* ':' should be prior to function+offset */
10938
- func_name = strrchr (binary_path , ':' );
10939
- if (!func_name ) {
10940
- pr_warn ("section '%s' missing ':function[+offset]' specification\n" ,
10922
+ n = sscanf (prog -> sec_name , "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li" ,
10923
+ & probe_type , & binary_path , & func_name , & offset );
10924
+ switch (n ) {
10925
+ case 1 :
10926
+ /* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */
10927
+ ret = 0 ;
10928
+ break ;
10929
+ case 2 :
10930
+ pr_warn ("prog '%s': section '%s' missing ':function[+offset]' specification\n" ,
10931
+ prog -> name , prog -> sec_name );
10932
+ break ;
10933
+ case 3 :
10934
+ case 4 :
10935
+ opts .retprobe = strcmp (probe_type , "uretprobe" ) == 0 ;
10936
+ if (opts .retprobe && offset != 0 ) {
10937
+ pr_warn ("prog '%s': uretprobes do not support offset specification\n" ,
10938
+ prog -> name );
10939
+ break ;
10940
+ }
10941
+ opts .func_name = func_name ;
10942
+ * link = bpf_program__attach_uprobe_opts (prog , -1 , binary_path , offset , & opts );
10943
+ ret = libbpf_get_error (* link );
10944
+ break ;
10945
+ default :
10946
+ pr_warn ("prog '%s': invalid format of section definition '%s'\n" , prog -> name ,
10941
10947
prog -> sec_name );
10942
- return - EINVAL ;
10943
- }
10944
- func_name [0 ] = '\0' ;
10945
- func_name ++ ;
10946
- n = sscanf (func_name , "%m[a-zA-Z0-9_.]+%li" , & func , & offset );
10947
- if (n < 1 ) {
10948
- pr_warn ("uprobe name '%s' is invalid\n" , func_name );
10949
- return - EINVAL ;
10950
- }
10951
- if (opts .retprobe && offset != 0 ) {
10952
- free (func );
10953
- pr_warn ("uretprobes do not support offset specification\n" );
10954
- return - EINVAL ;
10955
- }
10956
-
10957
- /* Is func a raw address? */
10958
- errno = 0 ;
10959
- raw_offset = strtoull (func , & func_end , 0 );
10960
- if (!errno && !* func_end ) {
10961
- free (func );
10962
- func = NULL ;
10963
- offset = (size_t )raw_offset ;
10948
+ break ;
10964
10949
}
10965
- opts .func_name = func ;
10950
+ free (probe_type );
10951
+ free (binary_path );
10952
+ free (func_name );
10966
10953
10967
- * link = bpf_program__attach_uprobe_opts (prog , -1 , binary_path , offset , & opts );
10968
- free (func );
10969
- return libbpf_get_error (* link );
10954
+ return ret ;
10970
10955
}
10971
10956
10972
10957
struct bpf_link * bpf_program__attach_uprobe (const struct bpf_program * prog ,
0 commit comments