Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 26452
b: refs/heads/master
c: 9c7aa6a
h: refs/heads/master
v: v3
  • Loading branch information
Steve Grubb authored and Al Viro committed May 1, 2006
1 parent 2ebc1e9 commit 662f62c
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 78 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: 1b50eed9cac0e8e5e4d3a522d8aa267f7f8f8acb
refs/heads/master: 9c7aa6aa74fa8a5cda36e54cbbe4fffe0214497d
16 changes: 0 additions & 16 deletions trunk/include/linux/security.h
Original file line number Diff line number Diff line change
Expand Up @@ -869,11 +869,6 @@ struct swap_info_struct;
* @ipcp contains the kernel IPC permission structure
* @flag contains the desired (requested) permission set
* Return 0 if permission is granted.
* @ipc_getsecurity:
* Copy the security label associated with the ipc object into
* @buffer. @buffer may be NULL to request the size of the buffer
* required. @size indicates the size of @buffer in bytes. Return
* number of bytes used/required on success.
*
* Security hooks for individual messages held in System V IPC message queues
* @msg_msg_alloc_security:
Expand Down Expand Up @@ -1223,7 +1218,6 @@ struct security_operations {
void (*task_to_inode)(struct task_struct *p, struct inode *inode);

int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag);
int (*ipc_getsecurity)(struct kern_ipc_perm *ipcp, void *buffer, size_t size);

int (*msg_msg_alloc_security) (struct msg_msg * msg);
void (*msg_msg_free_security) (struct msg_msg * msg);
Expand Down Expand Up @@ -1887,11 +1881,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp,
return security_ops->ipc_permission (ipcp, flag);
}

static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
{
return security_ops->ipc_getsecurity(ipcp, buffer, size);
}

static inline int security_msg_msg_alloc (struct msg_msg * msg)
{
return security_ops->msg_msg_alloc_security (msg);
Expand Down Expand Up @@ -2532,11 +2521,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp,
return 0;
}

static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
{
return -EOPNOTSUPP;
}

static inline int security_msg_msg_alloc (struct msg_msg * msg)
{
return 0;
Expand Down
15 changes: 15 additions & 0 deletions trunk/include/linux/selinux.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
struct selinux_audit_rule;
struct audit_context;
struct inode;
struct kern_ipc_perm;

#ifdef CONFIG_SECURITY_SELINUX

Expand Down Expand Up @@ -98,6 +99,15 @@ int selinux_ctxid_to_string(u32 ctxid, char **ctx, u32 *ctxlen);
*/
void selinux_get_inode_sid(const struct inode *inode, u32 *sid);

/**
* selinux_get_ipc_sid - get the ipc security context ID
* @ipcp: ipc structure to get the sid from.
* @sid: pointer to security context ID to be filled in.
*
* Returns nothing
*/
void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid);

#else

static inline int selinux_audit_rule_init(u32 field, u32 op,
Expand Down Expand Up @@ -141,6 +151,11 @@ static inline void selinux_get_inode_sid(const struct inode *inode, u32 *sid)
*sid = 0;
}

static inline void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid)
{
*sid = 0;
}

#endif /* CONFIG_SECURITY_SELINUX */

#endif /* _LINUX_SELINUX_H */
68 changes: 21 additions & 47 deletions trunk/kernel/auditsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ struct audit_aux_data_ipcctl {
uid_t uid;
gid_t gid;
mode_t mode;
char *ctx;
u32 osid;
};

struct audit_aux_data_socketcall {
Expand Down Expand Up @@ -432,11 +432,6 @@ static inline void audit_free_aux(struct audit_context *context)
dput(axi->dentry);
mntput(axi->mnt);
}
if ( aux->type == AUDIT_IPC ) {
struct audit_aux_data_ipcctl *axi = (void *)aux;
if (axi->ctx)
kfree(axi->ctx);
}

context->aux = aux->next;
kfree(aux);
Expand Down Expand Up @@ -584,7 +579,7 @@ static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk

static void audit_log_exit(struct audit_context *context, struct task_struct *tsk)
{
int i;
int i, call_panic = 0;
struct audit_buffer *ab;
struct audit_aux_data *aux;
const char *tty;
Expand Down Expand Up @@ -635,8 +630,20 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts
case AUDIT_IPC: {
struct audit_aux_data_ipcctl *axi = (void *)aux;
audit_log_format(ab,
" qbytes=%lx iuid=%u igid=%u mode=%x obj=%s",
axi->qbytes, axi->uid, axi->gid, axi->mode, axi->ctx);
" qbytes=%lx iuid=%u igid=%u mode=%x",
axi->qbytes, axi->uid, axi->gid, axi->mode);
if (axi->osid != 0) {
char *ctx = NULL;
u32 len;
if (selinux_ctxid_to_string(
axi->osid, &ctx, &len)) {
audit_log_format(ab, " obj=%u",
axi->osid);
call_panic = 1;
} else
audit_log_format(ab, " obj=%s", ctx);
kfree(ctx);
}
break; }

case AUDIT_SOCKETCALL: {
Expand Down Expand Up @@ -671,7 +678,6 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts
}
}
for (i = 0; i < context->name_count; i++) {
int call_panic = 0;
unsigned long ino = context->names[i].ino;
unsigned long pino = context->names[i].pino;

Expand Down Expand Up @@ -708,16 +714,16 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts
context->names[i].osid, &ctx, &len)) {
audit_log_format(ab, " obj=%u",
context->names[i].osid);
call_panic = 1;
call_panic = 2;
} else
audit_log_format(ab, " obj=%s", ctx);
kfree(ctx);
}

audit_log_end(ab);
if (call_panic)
audit_panic("error converting sid to string");
}
if (call_panic)
audit_panic("error converting sid to string");
}

/**
Expand Down Expand Up @@ -951,7 +957,7 @@ void audit_putname(const char *name)
#endif
}

void audit_inode_context(int idx, const struct inode *inode)
static void audit_inode_context(int idx, const struct inode *inode)
{
struct audit_context *context = current->audit_context;

Expand Down Expand Up @@ -1141,38 +1147,6 @@ uid_t audit_get_loginuid(struct audit_context *ctx)
return ctx ? ctx->loginuid : -1;
}

static char *audit_ipc_context(struct kern_ipc_perm *ipcp)
{
struct audit_context *context = current->audit_context;
char *ctx = NULL;
int len = 0;

if (likely(!context))
return NULL;

len = security_ipc_getsecurity(ipcp, NULL, 0);
if (len == -EOPNOTSUPP)
goto ret;
if (len < 0)
goto error_path;

ctx = kmalloc(len, GFP_ATOMIC);
if (!ctx)
goto error_path;

len = security_ipc_getsecurity(ipcp, ctx, len);
if (len < 0)
goto error_path;

return ctx;

error_path:
kfree(ctx);
audit_panic("error in audit_ipc_context");
ret:
return NULL;
}

/**
* audit_ipc_perms - record audit data for ipc
* @qbytes: msgq bytes
Expand All @@ -1198,7 +1172,7 @@ int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, str
ax->uid = uid;
ax->gid = gid;
ax->mode = mode;
ax->ctx = audit_ipc_context(ipcp);
selinux_get_ipc_sid(ipcp, &ax->osid);

ax->d.type = AUDIT_IPC;
ax->d.next = context->aux;
Expand Down
6 changes: 0 additions & 6 deletions trunk/security/dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,11 +563,6 @@ static int dummy_ipc_permission (struct kern_ipc_perm *ipcp, short flag)
return 0;
}

static int dummy_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
{
return -EOPNOTSUPP;
}

static int dummy_msg_msg_alloc_security (struct msg_msg *msg)
{
return 0;
Expand Down Expand Up @@ -976,7 +971,6 @@ void security_fixup_ops (struct security_operations *ops)
set_to_dummy_if_null(ops, task_reparent_to_init);
set_to_dummy_if_null(ops, task_to_inode);
set_to_dummy_if_null(ops, ipc_permission);
set_to_dummy_if_null(ops, ipc_getsecurity);
set_to_dummy_if_null(ops, msg_msg_alloc_security);
set_to_dummy_if_null(ops, msg_msg_free_security);
set_to_dummy_if_null(ops, msg_queue_alloc_security);
Expand Down
11 changes: 11 additions & 0 deletions trunk/security/selinux/exports.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/selinux.h>
#include <linux/fs.h>
#include <linux/ipc.h>

#include "security.h"
#include "objsec.h"
Expand Down Expand Up @@ -50,3 +51,13 @@ void selinux_get_inode_sid(const struct inode *inode, u32 *sid)
*sid = 0;
}

void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid)
{
if (selinux_enabled) {
struct ipc_security_struct *isec = ipcp->security;
*sid = isec->sid;
return;
}
*sid = 0;
}

8 changes: 0 additions & 8 deletions trunk/security/selinux/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -4052,13 +4052,6 @@ static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
return ipc_has_perm(ipcp, av);
}

static int selinux_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size)
{
struct ipc_security_struct *isec = ipcp->security;

return selinux_getsecurity(isec->sid, buffer, size);
}

/* module stacking operations */
static int selinux_register_security (const char *name, struct security_operations *ops)
{
Expand Down Expand Up @@ -4321,7 +4314,6 @@ static struct security_operations selinux_ops = {
.task_to_inode = selinux_task_to_inode,

.ipc_permission = selinux_ipc_permission,
.ipc_getsecurity = selinux_ipc_getsecurity,

.msg_msg_alloc_security = selinux_msg_msg_alloc_security,
.msg_msg_free_security = selinux_msg_msg_free_security,
Expand Down

0 comments on commit 662f62c

Please sign in to comment.