Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 84642
b: refs/heads/master
c: b2d75cd
h: refs/heads/master
v: v3
  • Loading branch information
Pavel Emelyanov authored and Linus Torvalds committed Feb 8, 2008
1 parent 184f015 commit abbcf4b
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 59 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a46c9994242978ab001299cc9c906b9a3eedadcc
refs/heads/master: b2d75cddc83a349ef5633f609b9734b6b957f90f
55 changes: 53 additions & 2 deletions trunk/ipc/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
* This routine is called by sys_msgget, sys_semget() and sys_shmget()
* when the key is IPC_PRIVATE.
*/
int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params)
{
int err;
Expand Down Expand Up @@ -312,7 +312,7 @@ static int ipc_check_perms(struct kern_ipc_perm *ipcp, struct ipc_ops *ops,
*
* On success, the ipc id is returned.
*/
int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params)
{
struct kern_ipc_perm *ipcp;
Expand Down Expand Up @@ -710,6 +710,57 @@ struct kern_ipc_perm *ipc_lock_down(struct ipc_ids *ids, int id)
return out;
}

struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id)
{
struct kern_ipc_perm *out;

out = ipc_lock_down(ids, id);
if (IS_ERR(out))
return out;

if (ipc_checkid(out, id)) {
ipc_unlock(out);
return ERR_PTR(-EIDRM);
}

return out;
}

struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id)
{
struct kern_ipc_perm *out;

out = ipc_lock(ids, id);
if (IS_ERR(out))
return out;

if (ipc_checkid(out, id)) {
ipc_unlock(out);
return ERR_PTR(-EIDRM);
}

return out;
}

/**
* ipcget - Common sys_*get() code
* @ns : namsepace
* @ids : IPC identifier set
* @ops : operations to be called on ipc object creation, permission checks
* and further checks
* @params : the parameters needed by the previous operations.
*
* Common routine called by sys_msgget(), sys_semget() and sys_shmget().
*/
int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params)
{
if (params->key == IPC_PRIVATE)
return ipcget_new(ns, ids, ops, params);
else
return ipcget_public(ns, ids, ops, params);
}

#ifdef __ARCH_WANT_IPC_PARSE_VERSION


Expand Down
60 changes: 4 additions & 56 deletions trunk/ipc/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,6 @@ int ipc_parse_version (int *cmd);
extern void free_msg(struct msg_msg *msg);
extern struct msg_msg *load_msg(const void __user *src, int len);
extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
extern int ipcget_new(struct ipc_namespace *, struct ipc_ids *,
struct ipc_ops *, struct ipc_params *);
extern int ipcget_public(struct ipc_namespace *, struct ipc_ids *,
struct ipc_ops *, struct ipc_params *);

static inline int ipc_buildid(int id, int seq)
{
Expand Down Expand Up @@ -163,57 +159,9 @@ static inline void ipc_unlock(struct kern_ipc_perm *perm)
rcu_read_unlock();
}

static inline struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids,
int id)
{
struct kern_ipc_perm *out;

out = ipc_lock_down(ids, id);
if (IS_ERR(out))
return out;

if (ipc_checkid(out, id)) {
ipc_unlock(out);
return ERR_PTR(-EIDRM);
}

return out;
}

static inline struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids,
int id)
{
struct kern_ipc_perm *out;

out = ipc_lock(ids, id);
if (IS_ERR(out))
return out;

if (ipc_checkid(out, id)) {
ipc_unlock(out);
return ERR_PTR(-EIDRM);
}

return out;
}

/**
* ipcget - Common sys_*get() code
* @ns : namsepace
* @ids : IPC identifier set
* @ops : operations to be called on ipc object creation, permission checks
* and further checks
* @params : the parameters needed by the previous operations.
*
* Common routine called by sys_msgget(), sys_semget() and sys_shmget().
*/
static inline int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params)
{
if (params->key == IPC_PRIVATE)
return ipcget_new(ns, ids, ops, params);
else
return ipcget_public(ns, ids, ops, params);
}
struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id);
struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id);
int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
struct ipc_ops *ops, struct ipc_params *params);

#endif

0 comments on commit abbcf4b

Please sign in to comment.