@@ -116,67 +116,52 @@ int bpf_token_create(union bpf_attr *attr)
116116	struct  user_namespace  * userns ;
117117	struct  inode  * inode ;
118118	struct  file  * file ;
119+ 	CLASS (fd , f )(attr -> token_create .bpffs_fd );
119120	struct  path  path ;
120- 	struct  fd   f ;
121+ 	struct  super_block   * sb ;
121122	umode_t  mode ;
122123	int  err , fd ;
123124
124- 	f  =  fdget (attr -> token_create .bpffs_fd );
125- 	if  (!fd_file (f ))
125+ 	if  (fd_empty (f ))
126126		return  - EBADF ;
127127
128128	path  =  fd_file (f )-> f_path ;
129- 	path_get (& path );
130- 	fdput (f );
129+ 	sb  =  path .dentry -> d_sb ;
131130
132- 	if  (path .dentry  !=  path .mnt -> mnt_sb -> s_root ) {
133- 		err  =  - EINVAL ;
134- 		goto out_path ;
135- 	}
136- 	if  (path .mnt -> mnt_sb -> s_op  !=  & bpf_super_ops ) {
137- 		err  =  - EINVAL ;
138- 		goto out_path ;
139- 	}
131+ 	if  (path .dentry  !=  sb -> s_root )
132+ 		return  - EINVAL ;
133+ 	if  (sb -> s_op  !=  & bpf_super_ops )
134+ 		return  - EINVAL ;
140135	err  =  path_permission (& path , MAY_ACCESS );
141136	if  (err )
142- 		goto  out_path ;
137+ 		return   err ;
143138
144- 	userns  =  path . dentry -> d_sb -> s_user_ns ;
139+ 	userns  =  sb -> s_user_ns ;
145140	/* 
146141	 * Enforce that creators of BPF tokens are in the same user 
147142	 * namespace as the BPF FS instance. This makes reasoning about 
148143	 * permissions a lot easier and we can always relax this later. 
149144	 */ 
150- 	if  (current_user_ns () !=  userns ) {
151- 		err  =  - EPERM ;
152- 		goto out_path ;
153- 	}
154- 	if  (!ns_capable (userns , CAP_BPF )) {
155- 		err  =  - EPERM ;
156- 		goto out_path ;
157- 	}
145+ 	if  (current_user_ns () !=  userns )
146+ 		return  - EPERM ;
147+ 	if  (!ns_capable (userns , CAP_BPF ))
148+ 		return  - EPERM ;
158149
159150	/* Creating BPF token in init_user_ns doesn't make much sense. */ 
160- 	if  (current_user_ns () ==  & init_user_ns ) {
161- 		err  =  - EOPNOTSUPP ;
162- 		goto out_path ;
163- 	}
151+ 	if  (current_user_ns () ==  & init_user_ns )
152+ 		return  - EOPNOTSUPP ;
164153
165- 	mnt_opts  =  path . dentry -> d_sb -> s_fs_info ;
154+ 	mnt_opts  =  sb -> s_fs_info ;
166155	if  (mnt_opts -> delegate_cmds  ==  0  && 
167156	    mnt_opts -> delegate_maps  ==  0  && 
168157	    mnt_opts -> delegate_progs  ==  0  && 
169- 	    mnt_opts -> delegate_attachs  ==  0 ) {
170- 		err  =  - ENOENT ; /* no BPF token delegation is set up */ 
171- 		goto out_path ;
172- 	}
158+ 	    mnt_opts -> delegate_attachs  ==  0 )
159+ 		return  - ENOENT ; /* no BPF token delegation is set up */ 
173160
174161	mode  =  S_IFREG  | ((S_IRUSR  | S_IWUSR ) &  ~current_umask ());
175- 	inode  =  bpf_get_inode (path .mnt -> mnt_sb , NULL , mode );
176- 	if  (IS_ERR (inode )) {
177- 		err  =  PTR_ERR (inode );
178- 		goto out_path ;
179- 	}
162+ 	inode  =  bpf_get_inode (sb , NULL , mode );
163+ 	if  (IS_ERR (inode ))
164+ 		return  PTR_ERR (inode );
180165
181166	inode -> i_op  =  & bpf_token_iops ;
182167	inode -> i_fop  =  & bpf_token_fops ;
@@ -185,8 +170,7 @@ int bpf_token_create(union bpf_attr *attr)
185170	file  =  alloc_file_pseudo (inode , path .mnt , BPF_TOKEN_INODE_NAME , O_RDWR , & bpf_token_fops );
186171	if  (IS_ERR (file )) {
187172		iput (inode );
188- 		err  =  PTR_ERR (file );
189- 		goto out_path ;
173+ 		return  PTR_ERR (file );
190174	}
191175
192176	token  =  kzalloc (sizeof (* token ), GFP_USER );
@@ -218,15 +202,12 @@ int bpf_token_create(union bpf_attr *attr)
218202	file -> private_data  =  token ;
219203	fd_install (fd , file );
220204
221- 	path_put (& path );
222205	return  fd ;
223206
224207out_token :
225208	bpf_token_free (token );
226209out_file :
227210	fput (file );
228- out_path :
229- 	path_put (& path );
230211	return  err ;
231212}
232213
0 commit comments