mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
Merge patch series "credentials guards: the easy cases"
Christian Brauner <brauner@kernel.org> says: This converts all users of override_creds() to rely on credentials guards. Leave all those that do the prepare_creds() + modify creds + override_creds() dance alone for now. Some of them qualify for their own variant. * patches from https://patch.msgid.link/20251103-work-creds-guards-simple-v1-0-a3e156839e7f@kernel.org: net/dns_resolver: use credential guards in dns_query() cgroup: use credential guards in cgroup_attach_permissions() act: use credential guards in acct_write_process() smb: use credential guards in cifs_get_spnego_key() nfs: use credential guards in nfs_idmap_get_key() nfs: use credential guards in nfs_local_call_write() nfs: use credential guards in nfs_local_call_read() erofs: use credential guards binfmt_misc: use credential guards backing-file: use credential guards for mmap backing-file: use credential guards for splice write backing-file: use credential guards for splice read backing-file: use credential guards for writes backing-file: use credential guards for reads aio: use credential guards cred: add {scoped_}with_creds() guards Link: https://patch.msgid.link/20251103-work-creds-guards-simple-v1-0-a3e156839e7f@kernel.org Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
commit
a85787996a
11 changed files with 142 additions and 149 deletions
6
fs/aio.c
6
fs/aio.c
|
|
@ -1640,10 +1640,10 @@ static int aio_write(struct kiocb *req, const struct iocb *iocb,
|
|||
static void aio_fsync_work(struct work_struct *work)
|
||||
{
|
||||
struct aio_kiocb *iocb = container_of(work, struct aio_kiocb, fsync.work);
|
||||
const struct cred *old_cred = override_creds(iocb->fsync.creds);
|
||||
|
||||
iocb->ki_res.res = vfs_fsync(iocb->fsync.file, iocb->fsync.datasync);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(iocb->fsync.creds)
|
||||
iocb->ki_res.res = vfs_fsync(iocb->fsync.file, iocb->fsync.datasync);
|
||||
|
||||
put_cred(iocb->fsync.creds);
|
||||
iocb_put(iocb);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,13 +157,37 @@ static int backing_aio_init_wq(struct kiocb *iocb)
|
|||
return sb_init_dio_done_wq(sb);
|
||||
}
|
||||
|
||||
static int do_backing_file_read_iter(struct file *file, struct iov_iter *iter,
|
||||
struct kiocb *iocb, int flags)
|
||||
{
|
||||
struct backing_aio *aio = NULL;
|
||||
int ret;
|
||||
|
||||
if (is_sync_kiocb(iocb)) {
|
||||
rwf_t rwf = iocb_to_rw_flags(flags);
|
||||
|
||||
return vfs_iter_read(file, iter, &iocb->ki_pos, rwf);
|
||||
}
|
||||
|
||||
aio = kmem_cache_zalloc(backing_aio_cachep, GFP_KERNEL);
|
||||
if (!aio)
|
||||
return -ENOMEM;
|
||||
|
||||
aio->orig_iocb = iocb;
|
||||
kiocb_clone(&aio->iocb, iocb, get_file(file));
|
||||
aio->iocb.ki_complete = backing_aio_rw_complete;
|
||||
refcount_set(&aio->ref, 2);
|
||||
ret = vfs_iocb_iter_read(file, &aio->iocb, iter);
|
||||
backing_aio_put(aio);
|
||||
if (ret != -EIOCBQUEUED)
|
||||
backing_aio_cleanup(aio, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t backing_file_read_iter(struct file *file, struct iov_iter *iter,
|
||||
struct kiocb *iocb, int flags,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
struct backing_aio *aio = NULL;
|
||||
const struct cred *old_cred;
|
||||
ssize_t ret;
|
||||
|
||||
if (WARN_ON_ONCE(!(file->f_mode & FMODE_BACKING)))
|
||||
|
|
@ -176,28 +200,8 @@ ssize_t backing_file_read_iter(struct file *file, struct iov_iter *iter,
|
|||
!(file->f_mode & FMODE_CAN_ODIRECT))
|
||||
return -EINVAL;
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
if (is_sync_kiocb(iocb)) {
|
||||
rwf_t rwf = iocb_to_rw_flags(flags);
|
||||
|
||||
ret = vfs_iter_read(file, iter, &iocb->ki_pos, rwf);
|
||||
} else {
|
||||
ret = -ENOMEM;
|
||||
aio = kmem_cache_zalloc(backing_aio_cachep, GFP_KERNEL);
|
||||
if (!aio)
|
||||
goto out;
|
||||
|
||||
aio->orig_iocb = iocb;
|
||||
kiocb_clone(&aio->iocb, iocb, get_file(file));
|
||||
aio->iocb.ki_complete = backing_aio_rw_complete;
|
||||
refcount_set(&aio->ref, 2);
|
||||
ret = vfs_iocb_iter_read(file, &aio->iocb, iter);
|
||||
backing_aio_put(aio);
|
||||
if (ret != -EIOCBQUEUED)
|
||||
backing_aio_cleanup(aio, ret);
|
||||
}
|
||||
out:
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(ctx->cred)
|
||||
ret = do_backing_file_read_iter(file, iter, iocb, flags);
|
||||
|
||||
if (ctx->accessed)
|
||||
ctx->accessed(iocb->ki_filp);
|
||||
|
|
@ -206,11 +210,47 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(backing_file_read_iter);
|
||||
|
||||
static int do_backing_file_write_iter(struct file *file, struct iov_iter *iter,
|
||||
struct kiocb *iocb, int flags,
|
||||
void (*end_write)(struct kiocb *, ssize_t))
|
||||
{
|
||||
struct backing_aio *aio;
|
||||
int ret;
|
||||
|
||||
if (is_sync_kiocb(iocb)) {
|
||||
rwf_t rwf = iocb_to_rw_flags(flags);
|
||||
|
||||
ret = vfs_iter_write(file, iter, &iocb->ki_pos, rwf);
|
||||
if (end_write)
|
||||
end_write(iocb, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = backing_aio_init_wq(iocb);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
aio = kmem_cache_zalloc(backing_aio_cachep, GFP_KERNEL);
|
||||
if (!aio)
|
||||
return -ENOMEM;
|
||||
|
||||
aio->orig_iocb = iocb;
|
||||
aio->end_write = end_write;
|
||||
kiocb_clone(&aio->iocb, iocb, get_file(file));
|
||||
aio->iocb.ki_flags = flags;
|
||||
aio->iocb.ki_complete = backing_aio_queue_completion;
|
||||
refcount_set(&aio->ref, 2);
|
||||
ret = vfs_iocb_iter_write(file, &aio->iocb, iter);
|
||||
backing_aio_put(aio);
|
||||
if (ret != -EIOCBQUEUED)
|
||||
backing_aio_cleanup(aio, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t backing_file_write_iter(struct file *file, struct iov_iter *iter,
|
||||
struct kiocb *iocb, int flags,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
ssize_t ret;
|
||||
|
||||
if (WARN_ON_ONCE(!(file->f_mode & FMODE_BACKING)))
|
||||
|
|
@ -233,40 +273,8 @@ ssize_t backing_file_write_iter(struct file *file, struct iov_iter *iter,
|
|||
*/
|
||||
flags &= ~IOCB_DIO_CALLER_COMP;
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
if (is_sync_kiocb(iocb)) {
|
||||
rwf_t rwf = iocb_to_rw_flags(flags);
|
||||
|
||||
ret = vfs_iter_write(file, iter, &iocb->ki_pos, rwf);
|
||||
if (ctx->end_write)
|
||||
ctx->end_write(iocb, ret);
|
||||
} else {
|
||||
struct backing_aio *aio;
|
||||
|
||||
ret = backing_aio_init_wq(iocb);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = -ENOMEM;
|
||||
aio = kmem_cache_zalloc(backing_aio_cachep, GFP_KERNEL);
|
||||
if (!aio)
|
||||
goto out;
|
||||
|
||||
aio->orig_iocb = iocb;
|
||||
aio->end_write = ctx->end_write;
|
||||
kiocb_clone(&aio->iocb, iocb, get_file(file));
|
||||
aio->iocb.ki_flags = flags;
|
||||
aio->iocb.ki_complete = backing_aio_queue_completion;
|
||||
refcount_set(&aio->ref, 2);
|
||||
ret = vfs_iocb_iter_write(file, &aio->iocb, iter);
|
||||
backing_aio_put(aio);
|
||||
if (ret != -EIOCBQUEUED)
|
||||
backing_aio_cleanup(aio, ret);
|
||||
}
|
||||
out:
|
||||
revert_creds(old_cred);
|
||||
|
||||
return ret;
|
||||
scoped_with_creds(ctx->cred)
|
||||
return do_backing_file_write_iter(file, iter, iocb, flags, ctx->end_write);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(backing_file_write_iter);
|
||||
|
||||
|
|
@ -275,15 +283,13 @@ ssize_t backing_file_splice_read(struct file *in, struct kiocb *iocb,
|
|||
unsigned int flags,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
ssize_t ret;
|
||||
|
||||
if (WARN_ON_ONCE(!(in->f_mode & FMODE_BACKING)))
|
||||
return -EIO;
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
ret = vfs_splice_read(in, &iocb->ki_pos, pipe, len, flags);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(ctx->cred)
|
||||
ret = vfs_splice_read(in, &iocb->ki_pos, pipe, len, flags);
|
||||
|
||||
if (ctx->accessed)
|
||||
ctx->accessed(iocb->ki_filp);
|
||||
|
|
@ -297,7 +303,6 @@ ssize_t backing_file_splice_write(struct pipe_inode_info *pipe,
|
|||
size_t len, unsigned int flags,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
ssize_t ret;
|
||||
|
||||
if (WARN_ON_ONCE(!(out->f_mode & FMODE_BACKING)))
|
||||
|
|
@ -310,11 +315,11 @@ ssize_t backing_file_splice_write(struct pipe_inode_info *pipe,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
file_start_write(out);
|
||||
ret = out->f_op->splice_write(pipe, out, &iocb->ki_pos, len, flags);
|
||||
file_end_write(out);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(ctx->cred) {
|
||||
file_start_write(out);
|
||||
ret = out->f_op->splice_write(pipe, out, &iocb->ki_pos, len, flags);
|
||||
file_end_write(out);
|
||||
}
|
||||
|
||||
if (ctx->end_write)
|
||||
ctx->end_write(iocb, ret);
|
||||
|
|
@ -326,7 +331,6 @@ EXPORT_SYMBOL_GPL(backing_file_splice_write);
|
|||
int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
|
||||
struct backing_file_ctx *ctx)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
struct file *user_file = vma->vm_file;
|
||||
int ret;
|
||||
|
||||
|
|
@ -338,9 +342,8 @@ int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
|
|||
|
||||
vma_set_file(vma, file);
|
||||
|
||||
old_cred = override_creds(ctx->cred);
|
||||
ret = vfs_mmap(vma->vm_file, vma);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(ctx->cred)
|
||||
ret = vfs_mmap(vma->vm_file, vma);
|
||||
|
||||
if (ctx->accessed)
|
||||
ctx->accessed(user_file);
|
||||
|
|
|
|||
|
|
@ -782,8 +782,6 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
|
|||
return PTR_ERR(e);
|
||||
|
||||
if (e->flags & MISC_FMT_OPEN_FILE) {
|
||||
const struct cred *old_cred;
|
||||
|
||||
/*
|
||||
* Now that we support unprivileged binfmt_misc mounts make
|
||||
* sure we use the credentials that the register @file was
|
||||
|
|
@ -791,9 +789,8 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
|
|||
* didn't matter much as only a privileged process could open
|
||||
* the register file.
|
||||
*/
|
||||
old_cred = override_creds(file->f_cred);
|
||||
f = open_exec(e->interpreter);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(file->f_cred)
|
||||
f = open_exec(e->interpreter);
|
||||
if (IS_ERR(f)) {
|
||||
pr_notice("register: failed to install interpreter file %s\n",
|
||||
e->interpreter);
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
|
|||
|
||||
static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
|
||||
{
|
||||
const struct cred *old_cred;
|
||||
struct iov_iter iter;
|
||||
int ret;
|
||||
|
||||
|
|
@ -61,9 +60,8 @@ static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
|
|||
rq->iocb.ki_flags = IOCB_DIRECT;
|
||||
iov_iter_bvec(&iter, ITER_DEST, rq->bvecs, rq->bio.bi_vcnt,
|
||||
rq->bio.bi_iter.bi_size);
|
||||
old_cred = override_creds(rq->iocb.ki_filp->f_cred);
|
||||
ret = vfs_iocb_iter_read(rq->iocb.ki_filp, &rq->iocb, &iter);
|
||||
revert_creds(old_cred);
|
||||
scoped_with_creds(rq->iocb.ki_filp->f_cred)
|
||||
ret = vfs_iocb_iter_read(rq->iocb.ki_filp, &rq->iocb, &iter);
|
||||
if (ret != -EIOCBQUEUED)
|
||||
erofs_fileio_ki_complete(&rq->iocb, ret);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -595,29 +595,26 @@ static void nfs_local_call_read(struct work_struct *work)
|
|||
struct nfs_local_kiocb *iocb =
|
||||
container_of(work, struct nfs_local_kiocb, work);
|
||||
struct file *filp = iocb->kiocb.ki_filp;
|
||||
const struct cred *save_cred;
|
||||
ssize_t status;
|
||||
|
||||
save_cred = override_creds(filp->f_cred);
|
||||
scoped_with_creds(filp->f_cred) {
|
||||
for (int i = 0; i < iocb->n_iters ; i++) {
|
||||
if (iocb->iter_is_dio_aligned[i]) {
|
||||
iocb->kiocb.ki_flags |= IOCB_DIRECT;
|
||||
iocb->kiocb.ki_complete = nfs_local_read_aio_complete;
|
||||
iocb->aio_complete_work = nfs_local_read_aio_complete_work;
|
||||
}
|
||||
|
||||
for (int i = 0; i < iocb->n_iters ; i++) {
|
||||
if (iocb->iter_is_dio_aligned[i]) {
|
||||
iocb->kiocb.ki_flags |= IOCB_DIRECT;
|
||||
iocb->kiocb.ki_complete = nfs_local_read_aio_complete;
|
||||
iocb->aio_complete_work = nfs_local_read_aio_complete_work;
|
||||
}
|
||||
|
||||
iocb->kiocb.ki_pos = iocb->offset[i];
|
||||
status = filp->f_op->read_iter(&iocb->kiocb, &iocb->iters[i]);
|
||||
if (status != -EIOCBQUEUED) {
|
||||
nfs_local_pgio_done(iocb->hdr, status);
|
||||
if (iocb->hdr->task.tk_status)
|
||||
break;
|
||||
iocb->kiocb.ki_pos = iocb->offset[i];
|
||||
status = filp->f_op->read_iter(&iocb->kiocb, &iocb->iters[i]);
|
||||
if (status != -EIOCBQUEUED) {
|
||||
nfs_local_pgio_done(iocb->hdr, status);
|
||||
if (iocb->hdr->task.tk_status)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
revert_creds(save_cred);
|
||||
|
||||
if (status != -EIOCBQUEUED) {
|
||||
nfs_local_read_done(iocb, status);
|
||||
nfs_local_pgio_release(iocb);
|
||||
|
|
@ -784,18 +781,11 @@ static void nfs_local_write_aio_complete(struct kiocb *kiocb, long ret)
|
|||
nfs_local_pgio_aio_complete(iocb); /* Calls nfs_local_write_aio_complete_work */
|
||||
}
|
||||
|
||||
static void nfs_local_call_write(struct work_struct *work)
|
||||
static ssize_t do_nfs_local_call_write(struct nfs_local_kiocb *iocb,
|
||||
struct file *filp)
|
||||
{
|
||||
struct nfs_local_kiocb *iocb =
|
||||
container_of(work, struct nfs_local_kiocb, work);
|
||||
struct file *filp = iocb->kiocb.ki_filp;
|
||||
unsigned long old_flags = current->flags;
|
||||
const struct cred *save_cred;
|
||||
ssize_t status;
|
||||
|
||||
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
|
||||
save_cred = override_creds(filp->f_cred);
|
||||
|
||||
file_start_write(filp);
|
||||
for (int i = 0; i < iocb->n_iters ; i++) {
|
||||
if (iocb->iter_is_dio_aligned[i]) {
|
||||
|
|
@ -840,7 +830,22 @@ retry:
|
|||
}
|
||||
file_end_write(filp);
|
||||
|
||||
revert_creds(save_cred);
|
||||
return status;
|
||||
}
|
||||
|
||||
static void nfs_local_call_write(struct work_struct *work)
|
||||
{
|
||||
struct nfs_local_kiocb *iocb =
|
||||
container_of(work, struct nfs_local_kiocb, work);
|
||||
struct file *filp = iocb->kiocb.ki_filp;
|
||||
unsigned long old_flags = current->flags;
|
||||
ssize_t status;
|
||||
|
||||
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
|
||||
|
||||
scoped_with_creds(filp->f_cred)
|
||||
status = do_nfs_local_call_write(iocb, filp);
|
||||
|
||||
current->flags = old_flags;
|
||||
|
||||
if (status != -EIOCBQUEUED) {
|
||||
|
|
|
|||
|
|
@ -306,15 +306,12 @@ static ssize_t nfs_idmap_get_key(const char *name, size_t namelen,
|
|||
const char *type, void *data,
|
||||
size_t data_size, struct idmap *idmap)
|
||||
{
|
||||
const struct cred *saved_cred;
|
||||
struct key *rkey;
|
||||
const struct user_key_payload *payload;
|
||||
ssize_t ret;
|
||||
|
||||
saved_cred = override_creds(id_resolver_cache);
|
||||
rkey = nfs_idmap_request_key(name, namelen, type, idmap);
|
||||
revert_creds(saved_cred);
|
||||
|
||||
scoped_with_creds(id_resolver_cache)
|
||||
rkey = nfs_idmap_request_key(name, namelen, type, idmap);
|
||||
if (IS_ERR(rkey)) {
|
||||
ret = PTR_ERR(rkey);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo,
|
|||
size_t desc_len;
|
||||
struct key *spnego_key;
|
||||
const char *hostname = server->hostname;
|
||||
const struct cred *saved_cred;
|
||||
|
||||
/* length of fields (with semicolons): ver=0xyz ip4=ipaddress
|
||||
host=hostname sec=mechanism uid=0xFF user=username */
|
||||
|
|
@ -158,9 +157,8 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo,
|
|||
dp += sprintf(dp, ";upcall_target=app");
|
||||
|
||||
cifs_dbg(FYI, "key description = %s\n", description);
|
||||
saved_cred = override_creds(spnego_cred);
|
||||
spnego_key = request_key(&cifs_spnego_key_type, description, "");
|
||||
revert_creds(saved_cred);
|
||||
scoped_with_creds(spnego_cred)
|
||||
spnego_key = request_key(&cifs_spnego_key_type, description, "");
|
||||
|
||||
#ifdef CONFIG_CIFS_DEBUG2
|
||||
if (cifsFYI && !IS_ERR(spnego_key)) {
|
||||
|
|
|
|||
|
|
@ -192,8 +192,10 @@ DEFINE_CLASS(override_creds,
|
|||
revert_creds(_T),
|
||||
override_creds(override_cred), const struct cred *override_cred)
|
||||
|
||||
#define scoped_with_kernel_creds() \
|
||||
scoped_class(override_creds, __UNIQUE_ID(cred), kernel_cred())
|
||||
#define scoped_with_creds(cred) \
|
||||
scoped_class(override_creds, __UNIQUE_ID(label), cred)
|
||||
|
||||
#define scoped_with_kernel_creds() scoped_with_creds(kernel_cred())
|
||||
|
||||
/**
|
||||
* get_cred_many - Get references on a set of credentials
|
||||
|
|
|
|||
|
|
@ -520,26 +520,23 @@ static void fill_ac(struct bsd_acct_struct *acct)
|
|||
static void acct_write_process(struct bsd_acct_struct *acct)
|
||||
{
|
||||
struct file *file = acct->file;
|
||||
const struct cred *cred;
|
||||
acct_t *ac = &acct->ac;
|
||||
|
||||
/* Perform file operations on behalf of whoever enabled accounting */
|
||||
cred = override_creds(file->f_cred);
|
||||
|
||||
/*
|
||||
* First check to see if there is enough free_space to continue
|
||||
* the process accounting system. Then get freeze protection. If
|
||||
* the fs is frozen, just skip the write as we could deadlock
|
||||
* the system otherwise.
|
||||
*/
|
||||
if (check_free_space(acct) && file_start_write_trylock(file)) {
|
||||
/* it's been opened O_APPEND, so position is irrelevant */
|
||||
loff_t pos = 0;
|
||||
__kernel_write(file, ac, sizeof(acct_t), &pos);
|
||||
file_end_write(file);
|
||||
scoped_with_creds(file->f_cred) {
|
||||
/*
|
||||
* First check to see if there is enough free_space to continue
|
||||
* the process accounting system. Then get freeze protection. If
|
||||
* the fs is frozen, just skip the write as we could deadlock
|
||||
* the system otherwise.
|
||||
*/
|
||||
if (check_free_space(acct) && file_start_write_trylock(file)) {
|
||||
/* it's been opened O_APPEND, so position is irrelevant */
|
||||
loff_t pos = 0;
|
||||
__kernel_write(file, ac, sizeof(acct_t), &pos);
|
||||
file_end_write(file);
|
||||
}
|
||||
}
|
||||
|
||||
revert_creds(cred);
|
||||
}
|
||||
|
||||
static void do_acct_process(struct bsd_acct_struct *acct)
|
||||
|
|
|
|||
|
|
@ -5363,7 +5363,6 @@ static ssize_t __cgroup_procs_write(struct kernfs_open_file *of, char *buf,
|
|||
struct cgroup_file_ctx *ctx = of->priv;
|
||||
struct cgroup *src_cgrp, *dst_cgrp;
|
||||
struct task_struct *task;
|
||||
const struct cred *saved_cred;
|
||||
ssize_t ret;
|
||||
enum cgroup_attach_lock_mode lock_mode;
|
||||
|
||||
|
|
@ -5386,11 +5385,10 @@ static ssize_t __cgroup_procs_write(struct kernfs_open_file *of, char *buf,
|
|||
* permissions using the credentials from file open to protect against
|
||||
* inherited fd attacks.
|
||||
*/
|
||||
saved_cred = override_creds(of->file->f_cred);
|
||||
ret = cgroup_attach_permissions(src_cgrp, dst_cgrp,
|
||||
of->file->f_path.dentry->d_sb,
|
||||
threadgroup, ctx->ns);
|
||||
revert_creds(saved_cred);
|
||||
scoped_with_creds(of->file->f_cred)
|
||||
ret = cgroup_attach_permissions(src_cgrp, dst_cgrp,
|
||||
of->file->f_path.dentry->d_sb,
|
||||
threadgroup, ctx->ns);
|
||||
if (ret)
|
||||
goto out_finish;
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@ int dns_query(struct net *net,
|
|||
{
|
||||
struct key *rkey;
|
||||
struct user_key_payload *upayload;
|
||||
const struct cred *saved_cred;
|
||||
size_t typelen, desclen;
|
||||
char *desc, *cp;
|
||||
int ret, len;
|
||||
|
|
@ -124,9 +123,8 @@ int dns_query(struct net *net,
|
|||
/* make the upcall, using special credentials to prevent the use of
|
||||
* add_key() to preinstall malicious redirections
|
||||
*/
|
||||
saved_cred = override_creds(dns_resolver_cache);
|
||||
rkey = request_key_net(&key_type_dns_resolver, desc, net, options);
|
||||
revert_creds(saved_cred);
|
||||
scoped_with_creds(dns_resolver_cache)
|
||||
rkey = request_key_net(&key_type_dns_resolver, desc, net, options);
|
||||
kfree(desc);
|
||||
if (IS_ERR(rkey)) {
|
||||
ret = PTR_ERR(rkey);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue