Skip to content

Commit 37c12fc

Browse files
committed
Merge tag 'kernel-6.14-rc1.cred' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull cred refcount updates from Christian Brauner: "For the v6.13 cycle we switched overlayfs to a variant of override_creds() that doesn't take an extra reference. To this end the {override,revert}_creds_light() helpers were introduced. This generalizes the idea behind {override,revert}_creds_light() to the {override,revert}_creds() helpers. Afterwards overriding and reverting credentials is reference count free unless the caller explicitly takes a reference. All callers have been appropriately ported" * tag 'kernel-6.14-rc1.cred' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (30 commits) cred: fold get_new_cred_many() into get_cred_many() cred: remove unused get_new_cred() nfsd: avoid pointless cred reference count bump cachefiles: avoid pointless cred reference count bump dns_resolver: avoid pointless cred reference count bump trace: avoid pointless cred reference count bump cgroup: avoid pointless cred reference count bump acct: avoid pointless reference count bump io_uring: avoid pointless cred reference count bump smb: avoid pointless cred reference count bump cifs: avoid pointless cred reference count bump cifs: avoid pointless cred reference count bump ovl: avoid pointless cred reference count bump open: avoid pointless cred reference count bump nfsfh: avoid pointless cred reference count bump nfs/nfs4recover: avoid pointless cred reference count bump nfs/nfs4idmap: avoid pointless reference count bump nfs/localio: avoid pointless cred reference count bumps coredump: avoid pointless cred reference count bump binfmt_misc: avoid pointless cred reference count bump ...
2 parents 5f85bd6 + a6babf4 commit 37c12fc

File tree

13 files changed

+29
-129
lines changed

13 files changed

+29
-129
lines changed

Documentation/security/credentials.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -527,11 +527,6 @@ There are some functions to help manage credentials:
527527
This gets a reference on a live set of credentials, returning a pointer to
528528
that set of credentials.
529529

530-
- ``struct cred *get_new_cred(struct cred *cred);``
531-
532-
This gets a reference on a set of credentials that is under construction
533-
and is thus still mutable, returning a pointer to that set of credentials.
534-
535530

536531
Open File Credentials
537532
=====================

drivers/crypto/ccp/sev-dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ static struct file *open_file_as_root(const char *filename, int flags, umode_t m
249249
fp = file_open_root(&root, filename, flags, mode);
250250
path_put(&root);
251251

252-
revert_creds(old_cred);
252+
put_cred(revert_creds(old_cred));
253253

254254
return fp;
255255
}

fs/backing-file.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ ssize_t backing_file_read_iter(struct file *file, struct iov_iter *iter,
176176
!(file->f_mode & FMODE_CAN_ODIRECT))
177177
return -EINVAL;
178178

179-
old_cred = override_creds_light(ctx->cred);
179+
old_cred = override_creds(ctx->cred);
180180
if (is_sync_kiocb(iocb)) {
181181
rwf_t rwf = iocb_to_rw_flags(flags);
182182

@@ -197,7 +197,7 @@ ssize_t backing_file_read_iter(struct file *file, struct iov_iter *iter,
197197
backing_aio_cleanup(aio, ret);
198198
}
199199
out:
200-
revert_creds_light(old_cred);
200+
revert_creds(old_cred);
201201

202202
if (ctx->accessed)
203203
ctx->accessed(iocb->ki_filp);
@@ -233,7 +233,7 @@ ssize_t backing_file_write_iter(struct file *file, struct iov_iter *iter,
233233
*/
234234
flags &= ~IOCB_DIO_CALLER_COMP;
235235

236-
old_cred = override_creds_light(ctx->cred);
236+
old_cred = override_creds(ctx->cred);
237237
if (is_sync_kiocb(iocb)) {
238238
rwf_t rwf = iocb_to_rw_flags(flags);
239239

@@ -264,7 +264,7 @@ ssize_t backing_file_write_iter(struct file *file, struct iov_iter *iter,
264264
backing_aio_cleanup(aio, ret);
265265
}
266266
out:
267-
revert_creds_light(old_cred);
267+
revert_creds(old_cred);
268268

269269
return ret;
270270
}
@@ -281,9 +281,9 @@ ssize_t backing_file_splice_read(struct file *in, struct kiocb *iocb,
281281
if (WARN_ON_ONCE(!(in->f_mode & FMODE_BACKING)))
282282
return -EIO;
283283

284-
old_cred = override_creds_light(ctx->cred);
284+
old_cred = override_creds(ctx->cred);
285285
ret = vfs_splice_read(in, &iocb->ki_pos, pipe, len, flags);
286-
revert_creds_light(old_cred);
286+
revert_creds(old_cred);
287287

288288
if (ctx->accessed)
289289
ctx->accessed(iocb->ki_filp);
@@ -310,11 +310,11 @@ ssize_t backing_file_splice_write(struct pipe_inode_info *pipe,
310310
if (ret)
311311
return ret;
312312

313-
old_cred = override_creds_light(ctx->cred);
313+
old_cred = override_creds(ctx->cred);
314314
file_start_write(out);
315315
ret = out->f_op->splice_write(pipe, out, &iocb->ki_pos, len, flags);
316316
file_end_write(out);
317-
revert_creds_light(old_cred);
317+
revert_creds(old_cred);
318318

319319
if (ctx->end_write)
320320
ctx->end_write(iocb, ret);
@@ -338,9 +338,9 @@ int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
338338

339339
vma_set_file(vma, file);
340340

341-
old_cred = override_creds_light(ctx->cred);
341+
old_cred = override_creds(ctx->cred);
342342
ret = call_mmap(vma->vm_file, vma);
343-
revert_creds_light(old_cred);
343+
revert_creds(old_cred);
344344

345345
if (ctx->accessed)
346346
ctx->accessed(user_file);

fs/nfsd/auth.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ int nfsd_setuser(struct svc_cred *cred, struct svc_export *exp)
2727
int flags = nfsexp_flags(cred, exp);
2828

2929
/* discard any old override before preparing the new set */
30-
revert_creds(get_cred(current_real_cred()));
30+
put_cred(revert_creds(get_cred(current_real_cred())));
3131
new = prepare_creds();
3232
if (!new)
3333
return -ENOMEM;
@@ -80,7 +80,6 @@ int nfsd_setuser(struct svc_cred *cred, struct svc_export *exp)
8080
new->cap_effective = cap_raise_nfsd_set(new->cap_effective,
8181
new->cap_permitted);
8282
put_cred(override_creds(new));
83-
put_cred(new);
8483
return 0;
8584

8685
oom:

fs/nfsd/filecache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1248,7 +1248,7 @@ nfsd_file_acquire_local(struct net *net, struct svc_cred *cred,
12481248

12491249
beres = nfsd_file_do_acquire(NULL, net, cred, client,
12501250
fhp, may_flags, NULL, pnf, true);
1251-
revert_creds(save_cred);
1251+
put_cred(revert_creds(save_cred));
12521252
return beres;
12531253
}
12541254

fs/nfsd/nfs4recover.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,13 @@ nfs4_save_creds(const struct cred **original_creds)
8282
new->fsuid = GLOBAL_ROOT_UID;
8383
new->fsgid = GLOBAL_ROOT_GID;
8484
*original_creds = override_creds(new);
85-
put_cred(new);
8685
return 0;
8786
}
8887

8988
static void
9089
nfs4_reset_creds(const struct cred *original)
9190
{
92-
revert_creds(original);
91+
put_cred(revert_creds(original));
9392
}
9493

9594
static void

fs/nfsd/nfsfh.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct net *net,
222222
cap_raise_nfsd_set(new->cap_effective,
223223
new->cap_permitted);
224224
put_cred(override_creds(new));
225-
put_cred(new);
226225
} else {
227226
error = nfsd_setuser_and_check_port(rqstp, cred, exp);
228227
if (error)

fs/open.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,6 @@ static bool access_need_override_creds(int flags)
402402

403403
static const struct cred *access_override_creds(void)
404404
{
405-
const struct cred *old_cred;
406405
struct cred *override_cred;
407406

408407
override_cred = prepare_creds();
@@ -447,13 +446,7 @@ static const struct cred *access_override_creds(void)
447446
* freeing.
448447
*/
449448
override_cred->non_rcu = 1;
450-
451-
old_cred = override_creds(override_cred);
452-
453-
/* override_cred() gets its own ref */
454-
put_cred(override_cred);
455-
456-
return old_cred;
449+
return override_creds(override_cred);
457450
}
458451

459452
static long do_faccessat(int dfd, const char __user *filename, int mode, int flags)
@@ -523,7 +516,7 @@ static long do_faccessat(int dfd, const char __user *filename, int mode, int fla
523516
}
524517
out:
525518
if (old_cred)
526-
revert_creds(old_cred);
519+
put_cred(revert_creds(old_cred));
527520

528521
return res;
529522
}

fs/overlayfs/dir.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,12 +575,12 @@ static const struct cred *ovl_setup_cred_for_create(struct dentry *dentry,
575575
}
576576

577577
/*
578-
* Caller is going to match this with revert_creds_light() and drop
578+
* Caller is going to match this with revert_creds() and drop
579579
* referenec on the returned creds.
580580
* We must be called with creator creds already, otherwise we risk
581581
* leaking creds.
582582
*/
583-
old_cred = override_creds_light(override_cred);
583+
old_cred = override_creds(override_cred);
584584
WARN_ON_ONCE(old_cred != ovl_creds(dentry->d_sb));
585585

586586
return override_cred;

fs/overlayfs/util.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ const struct cred *ovl_override_creds(struct super_block *sb)
6565
{
6666
struct ovl_fs *ofs = OVL_FS(sb);
6767

68-
return override_creds_light(ofs->creator_cred);
68+
return override_creds(ofs->creator_cred);
6969
}
7070

7171
void ovl_revert_creds(const struct cred *old_cred)
7272
{
73-
revert_creds_light(old_cred);
73+
revert_creds(old_cred);
7474
}
7575

7676
/*

0 commit comments

Comments
 (0)