You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
secmark: make secmark object handling generic
Right now secmark has lots of direct selinux calls. Use all LSM calls and remove all SELinux specific knowledge. The only SELinux specific knowledge we leave is the mode. The only point is to make sure that other LSMs at least test this generic code before they assume it works. (They may also have to make changes if they do not represent labels as strings) Signed-off-by: Eric Paris <eparis@redhat.com> Acked-by: Paul Moore <paul.moore@hp.com> Acked-by: Patrick McHardy <kaber@trash.net> Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
+16
-1
@@ -677,7 +677,18 @@ static void cap_inet_conn_established(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
}
|
||||
|
||||
static int cap_secmark_relabel_packet(u32 secid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cap_secmark_refcount_inc(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void cap_secmark_refcount_dec(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void cap_req_classify_flow(const struct request_sock *req,
|
||||
struct flowi *fl)
|
||||
@@ -777,7 +788,8 @@ static int cap_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
|
||||
|
||||
static int cap_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
*secid = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cap_release_secctx(char *secdata, u32 seclen)
|
||||
@@ -1018,6 +1030,9 @@ void __init security_fixup_ops(struct security_operations *ops)
|
||||
set_to_cap_if_null(ops, inet_conn_request);
|
||||
set_to_cap_if_null(ops, inet_csk_clone);
|
||||
set_to_cap_if_null(ops, inet_conn_established);
|
||||
set_to_cap_if_null(ops, secmark_relabel_packet);
|
||||
set_to_cap_if_null(ops, secmark_refcount_inc);
|
||||
set_to_cap_if_null(ops, secmark_refcount_dec);
|
||||
set_to_cap_if_null(ops, req_classify_flow);
|
||||
set_to_cap_if_null(ops, tun_dev_create);
|
||||
set_to_cap_if_null(ops, tun_dev_post_create);
|
||||
|
||||
@@ -1136,6 +1136,24 @@ void security_inet_conn_established(struct sock *sk,
|
||||
security_ops->inet_conn_established(sk, skb);
|
||||
}
|
||||
|
||||
int security_secmark_relabel_packet(u32 secid)
|
||||
{
|
||||
return security_ops->secmark_relabel_packet(secid);
|
||||
}
|
||||
EXPORT_SYMBOL(security_secmark_relabel_packet);
|
||||
|
||||
void security_secmark_refcount_inc(void)
|
||||
{
|
||||
security_ops->secmark_refcount_inc();
|
||||
}
|
||||
EXPORT_SYMBOL(security_secmark_refcount_inc);
|
||||
|
||||
void security_secmark_refcount_dec(void)
|
||||
{
|
||||
security_ops->secmark_refcount_dec();
|
||||
}
|
||||
EXPORT_SYMBOL(security_secmark_refcount_dec);
|
||||
|
||||
int security_tun_dev_create(void)
|
||||
{
|
||||
return security_ops->tun_dev_create();
|
||||
|
||||
@@ -11,58 +11,9 @@
|
||||
* it under the terms of the GNU General Public License version 2,
|
||||
* as published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/selinux.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ipc.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
#include "security.h"
|
||||
#include "objsec.h"
|
||||
|
||||
/* SECMARK reference count */
|
||||
extern atomic_t selinux_secmark_refcount;
|
||||
|
||||
int selinux_string_to_sid(char *str, u32 *sid)
|
||||
{
|
||||
if (selinux_enabled)
|
||||
return security_context_to_sid(str, strlen(str), sid);
|
||||
else {
|
||||
*sid = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(selinux_string_to_sid);
|
||||
|
||||
int selinux_secmark_relabel_packet_permission(u32 sid)
|
||||
{
|
||||
if (selinux_enabled) {
|
||||
const struct task_security_struct *__tsec;
|
||||
u32 tsid;
|
||||
|
||||
__tsec = current_security();
|
||||
tsid = __tsec->sid;
|
||||
|
||||
return avc_has_perm(tsid, sid, SECCLASS_PACKET,
|
||||
PACKET__RELABELTO, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(selinux_secmark_relabel_packet_permission);
|
||||
|
||||
void selinux_secmark_refcount_inc(void)
|
||||
{
|
||||
atomic_inc(&selinux_secmark_refcount);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(selinux_secmark_refcount_inc);
|
||||
|
||||
void selinux_secmark_refcount_dec(void)
|
||||
{
|
||||
atomic_dec(&selinux_secmark_refcount);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(selinux_secmark_refcount_dec);
|
||||
|
||||
bool selinux_is_enabled(void)
|
||||
{
|
||||
|
||||
@@ -4279,6 +4279,27 @@ static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
|
||||
selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
|
||||
}
|
||||
|
||||
static int selinux_secmark_relabel_packet(u32 sid)
|
||||
{
|
||||
const struct task_security_struct *__tsec;
|
||||
u32 tsid;
|
||||
|
||||
__tsec = current_security();
|
||||
tsid = __tsec->sid;
|
||||
|
||||
return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
|
||||
}
|
||||
|
||||
static void selinux_secmark_refcount_inc(void)
|
||||
{
|
||||
atomic_inc(&selinux_secmark_refcount);
|
||||
}
|
||||
|
||||
static void selinux_secmark_refcount_dec(void)
|
||||
{
|
||||
atomic_dec(&selinux_secmark_refcount);
|
||||
}
|
||||
|
||||
static void selinux_req_classify_flow(const struct request_sock *req,
|
||||
struct flowi *fl)
|
||||
{
|
||||
@@ -5533,6 +5554,9 @@ static struct security_operations selinux_ops = {
|
||||
.inet_conn_request = selinux_inet_conn_request,
|
||||
.inet_csk_clone = selinux_inet_csk_clone,
|
||||
.inet_conn_established = selinux_inet_conn_established,
|
||||
.secmark_relabel_packet = selinux_secmark_relabel_packet,
|
||||
.secmark_refcount_inc = selinux_secmark_refcount_inc,
|
||||
.secmark_refcount_dec = selinux_secmark_refcount_dec,
|
||||
.req_classify_flow = selinux_req_classify_flow,
|
||||
.tun_dev_create = selinux_tun_dev_create,
|
||||
.tun_dev_post_create = selinux_tun_dev_post_create,
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#define _SELINUX_SECURITY_H_
|
||||
|
||||
#include <linux/magic.h>
|
||||
#include <linux/types.h>
|
||||
#include "flask.h"
|
||||
|
||||
#define SECSID_NULL 0x00000000 /* unspecified SID */
|
||||
|
||||
Reference in New Issue
Block a user