mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
CRED: Use creds in file structs
Attach creds to file structs and discard f_uid/f_gid. file_operations::open() methods (such as hppfs_open()) should use file->f_cred rather than current_cred(). At the moment file->f_cred will be current_cred() at this point. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: James Morris <jmorris@namei.org> Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
parent
1d045980e1
commit
d76b0d9b2d
11 changed files with 31 additions and 27 deletions
|
@ -1085,8 +1085,8 @@ static int vpe_open(struct inode *inode, struct file *filp)
|
||||||
v->load_addr = NULL;
|
v->load_addr = NULL;
|
||||||
v->len = 0;
|
v->len = 0;
|
||||||
|
|
||||||
v->uid = filp->f_uid;
|
v->uid = filp->f_cred->fsuid;
|
||||||
v->gid = filp->f_gid;
|
v->gid = filp->f_cred->fsgid;
|
||||||
|
|
||||||
#ifdef CONFIG_MIPS_APSP_KSPD
|
#ifdef CONFIG_MIPS_APSP_KSPD
|
||||||
/* get kspd to tell us when a syscall_exit happens */
|
/* get kspd to tell us when a syscall_exit happens */
|
||||||
|
|
|
@ -246,7 +246,8 @@ hysdn_conf_open(struct inode *ino, struct file *filep)
|
||||||
}
|
}
|
||||||
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
||||||
hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
|
hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
|
||||||
filep->f_uid, filep->f_gid, filep->f_mode);
|
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
||||||
|
filep->f_mode);
|
||||||
|
|
||||||
if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
|
if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
|
||||||
/* write only access -> write boot file or conf line */
|
/* write only access -> write boot file or conf line */
|
||||||
|
@ -331,7 +332,8 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
|
||||||
}
|
}
|
||||||
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
|
||||||
hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
|
hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
|
||||||
filep->f_uid, filep->f_gid, filep->f_mode);
|
filep->f_cred->fsuid, filep->f_cred->fsgid,
|
||||||
|
filep->f_mode);
|
||||||
|
|
||||||
if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
|
if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
|
||||||
/* write only access -> write boot file or conf line */
|
/* write only access -> write boot file or conf line */
|
||||||
|
|
|
@ -174,7 +174,7 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)
|
||||||
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
|
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
|
||||||
|
|
||||||
err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),
|
err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),
|
||||||
coda_flags, coda_file->f_uid);
|
coda_flags, coda_file->f_cred->fsuid);
|
||||||
|
|
||||||
host_inode = cfi->cfi_container->f_path.dentry->d_inode;
|
host_inode = cfi->cfi_container->f_path.dentry->d_inode;
|
||||||
cii = ITOC(coda_inode);
|
cii = ITOC(coda_inode);
|
||||||
|
|
|
@ -36,7 +36,9 @@ static struct percpu_counter nr_files __cacheline_aligned_in_smp;
|
||||||
|
|
||||||
static inline void file_free_rcu(struct rcu_head *head)
|
static inline void file_free_rcu(struct rcu_head *head)
|
||||||
{
|
{
|
||||||
struct file *f = container_of(head, struct file, f_u.fu_rcuhead);
|
struct file *f = container_of(head, struct file, f_u.fu_rcuhead);
|
||||||
|
|
||||||
|
put_cred(f->f_cred);
|
||||||
kmem_cache_free(filp_cachep, f);
|
kmem_cache_free(filp_cachep, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,8 +123,7 @@ struct file *get_empty_filp(void)
|
||||||
INIT_LIST_HEAD(&f->f_u.fu_list);
|
INIT_LIST_HEAD(&f->f_u.fu_list);
|
||||||
atomic_long_set(&f->f_count, 1);
|
atomic_long_set(&f->f_count, 1);
|
||||||
rwlock_init(&f->f_owner.lock);
|
rwlock_init(&f->f_owner.lock);
|
||||||
f->f_uid = cred->fsuid;
|
f->f_cred = get_cred(cred);
|
||||||
f->f_gid = cred->fsgid;
|
|
||||||
eventpoll_init_file(f);
|
eventpoll_init_file(f);
|
||||||
/* f->f_version: 0 */
|
/* f->f_version: 0 */
|
||||||
return f;
|
return f;
|
||||||
|
|
|
@ -426,7 +426,7 @@ static int file_mode(int fmode)
|
||||||
|
|
||||||
static int hppfs_open(struct inode *inode, struct file *file)
|
static int hppfs_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
const struct cred *cred = current_cred();
|
const struct cred *cred = file->f_cred;
|
||||||
struct hppfs_private *data;
|
struct hppfs_private *data;
|
||||||
struct vfsmount *proc_mnt;
|
struct vfsmount *proc_mnt;
|
||||||
struct dentry *proc_dentry;
|
struct dentry *proc_dentry;
|
||||||
|
@ -490,7 +490,7 @@ static int hppfs_open(struct inode *inode, struct file *file)
|
||||||
|
|
||||||
static int hppfs_dir_open(struct inode *inode, struct file *file)
|
static int hppfs_dir_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
const struct cred *cred = current_cred();
|
const struct cred *cred = file->f_cred;
|
||||||
struct hppfs_private *data;
|
struct hppfs_private *data;
|
||||||
struct vfsmount *proc_mnt;
|
struct vfsmount *proc_mnt;
|
||||||
struct dentry *proc_dentry;
|
struct dentry *proc_dentry;
|
||||||
|
|
|
@ -827,7 +827,7 @@ struct file {
|
||||||
fmode_t f_mode;
|
fmode_t f_mode;
|
||||||
loff_t f_pos;
|
loff_t f_pos;
|
||||||
struct fown_struct f_owner;
|
struct fown_struct f_owner;
|
||||||
unsigned int f_uid, f_gid;
|
const struct cred *f_cred;
|
||||||
struct file_ra_state f_ra;
|
struct file_ra_state f_ra;
|
||||||
|
|
||||||
u64 f_version;
|
u64 f_version;
|
||||||
|
|
|
@ -340,8 +340,8 @@ static void dump_packet(const struct nf_loginfo *info,
|
||||||
read_lock_bh(&skb->sk->sk_callback_lock);
|
read_lock_bh(&skb->sk->sk_callback_lock);
|
||||||
if (skb->sk->sk_socket && skb->sk->sk_socket->file)
|
if (skb->sk->sk_socket && skb->sk->sk_socket->file)
|
||||||
printk("UID=%u GID=%u ",
|
printk("UID=%u GID=%u ",
|
||||||
skb->sk->sk_socket->file->f_uid,
|
skb->sk->sk_socket->file->f_cred->fsuid,
|
||||||
skb->sk->sk_socket->file->f_gid);
|
skb->sk->sk_socket->file->f_cred->fsgid);
|
||||||
read_unlock_bh(&skb->sk->sk_callback_lock);
|
read_unlock_bh(&skb->sk->sk_callback_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -364,8 +364,8 @@ static void dump_packet(const struct nf_loginfo *info,
|
||||||
read_lock_bh(&skb->sk->sk_callback_lock);
|
read_lock_bh(&skb->sk->sk_callback_lock);
|
||||||
if (skb->sk->sk_socket && skb->sk->sk_socket->file)
|
if (skb->sk->sk_socket && skb->sk->sk_socket->file)
|
||||||
printk("UID=%u GID=%u ",
|
printk("UID=%u GID=%u ",
|
||||||
skb->sk->sk_socket->file->f_uid,
|
skb->sk->sk_socket->file->f_cred->fsuid,
|
||||||
skb->sk->sk_socket->file->f_gid);
|
skb->sk->sk_socket->file->f_cred->fsgid);
|
||||||
read_unlock_bh(&skb->sk->sk_callback_lock);
|
read_unlock_bh(&skb->sk->sk_callback_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -474,8 +474,9 @@ __build_packet_message(struct nfulnl_instance *inst,
|
||||||
if (skb->sk) {
|
if (skb->sk) {
|
||||||
read_lock_bh(&skb->sk->sk_callback_lock);
|
read_lock_bh(&skb->sk->sk_callback_lock);
|
||||||
if (skb->sk->sk_socket && skb->sk->sk_socket->file) {
|
if (skb->sk->sk_socket && skb->sk->sk_socket->file) {
|
||||||
__be32 uid = htonl(skb->sk->sk_socket->file->f_uid);
|
struct file *file = skb->sk->sk_socket->file;
|
||||||
__be32 gid = htonl(skb->sk->sk_socket->file->f_gid);
|
__be32 uid = htonl(file->f_cred->fsuid);
|
||||||
|
__be32 gid = htonl(file->f_cred->fsgid);
|
||||||
/* need to unlock here since NLA_PUT may goto */
|
/* need to unlock here since NLA_PUT may goto */
|
||||||
read_unlock_bh(&skb->sk->sk_callback_lock);
|
read_unlock_bh(&skb->sk->sk_callback_lock);
|
||||||
NLA_PUT_BE32(inst->skb, NFULA_UID, uid);
|
NLA_PUT_BE32(inst->skb, NFULA_UID, uid);
|
||||||
|
|
|
@ -34,12 +34,12 @@ owner_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info->match & IPT_OWNER_UID)
|
if (info->match & IPT_OWNER_UID)
|
||||||
if ((filp->f_uid != info->uid) ^
|
if ((filp->f_cred->fsuid != info->uid) ^
|
||||||
!!(info->invert & IPT_OWNER_UID))
|
!!(info->invert & IPT_OWNER_UID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info->match & IPT_OWNER_GID)
|
if (info->match & IPT_OWNER_GID)
|
||||||
if ((filp->f_gid != info->gid) ^
|
if ((filp->f_cred->fsgid != info->gid) ^
|
||||||
!!(info->invert & IPT_OWNER_GID))
|
!!(info->invert & IPT_OWNER_GID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -60,12 +60,12 @@ owner_mt6_v0(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info->match & IP6T_OWNER_UID)
|
if (info->match & IP6T_OWNER_UID)
|
||||||
if ((filp->f_uid != info->uid) ^
|
if ((filp->f_cred->fsuid != info->uid) ^
|
||||||
!!(info->invert & IP6T_OWNER_UID))
|
!!(info->invert & IP6T_OWNER_UID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info->match & IP6T_OWNER_GID)
|
if (info->match & IP6T_OWNER_GID)
|
||||||
if ((filp->f_gid != info->gid) ^
|
if ((filp->f_cred->fsgid != info->gid) ^
|
||||||
!!(info->invert & IP6T_OWNER_GID))
|
!!(info->invert & IP6T_OWNER_GID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -93,14 +93,14 @@ owner_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||||
(XT_OWNER_UID | XT_OWNER_GID)) == 0;
|
(XT_OWNER_UID | XT_OWNER_GID)) == 0;
|
||||||
|
|
||||||
if (info->match & XT_OWNER_UID)
|
if (info->match & XT_OWNER_UID)
|
||||||
if ((filp->f_uid >= info->uid_min &&
|
if ((filp->f_cred->fsuid >= info->uid_min &&
|
||||||
filp->f_uid <= info->uid_max) ^
|
filp->f_cred->fsuid <= info->uid_max) ^
|
||||||
!(info->invert & XT_OWNER_UID))
|
!(info->invert & XT_OWNER_UID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info->match & XT_OWNER_GID)
|
if (info->match & XT_OWNER_GID)
|
||||||
if ((filp->f_gid >= info->gid_min &&
|
if ((filp->f_cred->fsgid >= info->gid_min &&
|
||||||
filp->f_gid <= info->gid_max) ^
|
filp->f_cred->fsgid <= info->gid_max) ^
|
||||||
!(info->invert & XT_OWNER_GID))
|
!(info->invert & XT_OWNER_GID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -260,14 +260,14 @@ static u32 flow_get_rtclassid(const struct sk_buff *skb)
|
||||||
static u32 flow_get_skuid(const struct sk_buff *skb)
|
static u32 flow_get_skuid(const struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file)
|
if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file)
|
||||||
return skb->sk->sk_socket->file->f_uid;
|
return skb->sk->sk_socket->file->f_cred->fsuid;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 flow_get_skgid(const struct sk_buff *skb)
|
static u32 flow_get_skgid(const struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file)
|
if (skb->sk && skb->sk->sk_socket && skb->sk->sk_socket->file)
|
||||||
return skb->sk->sk_socket->file->f_gid;
|
return skb->sk->sk_socket->file->f_cred->fsgid;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue