2019-06-01 10:08:55 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2010-07-29 14:47:59 -07:00
/*
* AppArmor security module
*
* This file contains AppArmor contexts used to associate " labels " to objects .
*
* Copyright ( C ) 1998 - 2008 Novell / SUSE
* Copyright 2009 - 2010 Canonical Ltd .
*/
# ifndef __AA_CONTEXT_H
# define __AA_CONTEXT_H
# include <linux/cred.h>
# include <linux/slab.h>
# include <linux/sched.h>
2017-06-09 08:14:28 -07:00
# include "label.h"
2017-01-16 00:42:50 -08:00
# include "policy_ns.h"
2017-10-08 00:43:02 -07:00
# include "task.h"
2010-07-29 14:47:59 -07:00
2018-09-21 17:17:59 -07:00
static inline struct aa_label * cred_label ( const struct cred * cred )
{
2018-11-12 09:30:56 -08:00
struct aa_label * * blob = cred - > security + apparmor_blob_sizes . lbs_cred ;
2018-09-21 17:17:59 -07:00
AA_BUG ( ! blob ) ;
return * blob ;
}
2017-01-20 01:59:25 -08:00
2018-09-21 17:17:59 -07:00
static inline void set_cred_label ( const struct cred * cred ,
struct aa_label * label )
{
2018-11-12 09:30:56 -08:00
struct aa_label * * blob = cred - > security + apparmor_blob_sizes . lbs_cred ;
2018-09-21 17:17:59 -07:00
AA_BUG ( ! blob ) ;
* blob = label ;
}
2010-07-29 14:47:59 -07:00
/**
2017-06-09 08:14:28 -07:00
* aa_cred_raw_label - obtain cred ' s label
* @ cred : cred to obtain label from ( NOT NULL )
2010-07-29 14:47:59 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : confining label
2010-07-29 14:47:59 -07:00
*
* does NOT increment reference count
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * aa_cred_raw_label ( const struct cred * cred )
2010-07-29 14:47:59 -07:00
{
2017-01-27 03:53:53 -08:00
struct aa_label * label = cred_label ( cred ) ;
2017-01-16 00:43:00 -08:00
2017-01-27 03:53:53 -08:00
AA_BUG ( ! label ) ;
return label ;
2010-07-29 14:47:59 -07:00
}
2013-02-18 16:03:34 -08:00
/**
2017-06-09 08:14:28 -07:00
* aa_get_newest_cred_label - obtain the newest label on a cred
* @ cred : cred to obtain label from ( NOT NULL )
2017-06-09 02:08:28 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : newest version of confining label
2017-06-09 02:08:28 -07:00
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * aa_get_newest_cred_label ( const struct cred * cred )
2017-06-09 02:08:28 -07:00
{
2017-06-09 08:14:28 -07:00
return aa_get_newest_label ( aa_cred_raw_label ( cred ) ) ;
2017-06-09 02:08:28 -07:00
}
/**
2017-06-09 08:14:28 -07:00
* __aa_task_raw_label - retrieve another task ' s label
2013-02-18 16:03:34 -08:00
* @ task : task to query ( NOT NULL )
*
2017-06-09 08:14:28 -07:00
* Returns : @ task ' s label without incrementing its ref count
2013-02-18 16:03:34 -08:00
*
* If @ task ! = current needs to be called in RCU safe critical section
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * __aa_task_raw_label ( struct task_struct * task )
2013-02-18 16:03:34 -08:00
{
2017-06-09 08:14:28 -07:00
return aa_cred_raw_label ( __task_cred ( task ) ) ;
2013-02-18 16:03:34 -08:00
}
2010-07-29 14:47:59 -07:00
/**
2017-06-09 08:14:28 -07:00
* aa_current_raw_label - find the current tasks confining label
2010-07-29 14:47:59 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : up to date confining label or the ns unconfined label ( NOT NULL )
2010-07-29 14:47:59 -07:00
*
* This fn will not update the tasks cred to the most up to date version
2017-06-09 08:14:28 -07:00
* of the label so it is safe to call when inside of locks .
2010-07-29 14:47:59 -07:00
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * aa_current_raw_label ( void )
2010-07-29 14:47:59 -07:00
{
2017-06-09 08:14:28 -07:00
return aa_cred_raw_label ( current_cred ( ) ) ;
2010-07-29 14:47:59 -07:00
}
/**
2017-06-09 08:14:28 -07:00
* aa_get_current_label - get the newest version of the current tasks label
2010-07-29 14:47:59 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : newest version of confining label ( NOT NULL )
2017-06-09 02:08:28 -07:00
*
* This fn will not update the tasks cred , so it is safe inside of locks
2010-07-29 14:47:59 -07:00
*
2017-06-09 08:14:28 -07:00
* The returned reference must be put with aa_put_label ( )
2010-07-29 14:47:59 -07:00
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * aa_get_current_label ( void )
2010-07-29 14:47:59 -07:00
{
2017-06-09 08:14:28 -07:00
struct aa_label * l = aa_current_raw_label ( ) ;
2010-07-29 14:47:59 -07:00
2017-06-09 08:14:28 -07:00
if ( label_is_stale ( l ) )
return aa_get_newest_label ( l ) ;
return aa_get_label ( l ) ;
2017-06-09 02:08:28 -07:00
}
2017-01-16 00:43:00 -08:00
2017-06-09 08:14:28 -07:00
# define __end_current_label_crit_section(X) end_current_label_crit_section(X)
2017-06-09 02:08:28 -07:00
/**
2017-06-09 08:14:28 -07:00
* end_label_crit_section - put a reference found with begin_current_label . .
* @ label : label reference to put
2017-06-09 02:08:28 -07:00
*
* Should only be used with a reference obtained with
2017-06-09 08:14:28 -07:00
* begin_current_label_crit_section and never used in situations where the
2017-06-09 02:08:28 -07:00
* task cred may be updated
*/
2017-06-09 08:14:28 -07:00
static inline void end_current_label_crit_section ( struct aa_label * label )
2017-06-09 02:08:28 -07:00
{
2017-06-09 08:14:28 -07:00
if ( label ! = aa_current_raw_label ( ) )
aa_put_label ( label ) ;
2017-06-09 02:08:28 -07:00
}
/**
2017-06-09 08:14:28 -07:00
* __begin_current_label_crit_section - current ' s confining label
2017-06-09 02:08:28 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : up to date confining label or the ns unconfined label ( NOT NULL )
2017-06-09 02:08:28 -07:00
*
* safe to call inside locks
*
2017-06-09 08:14:28 -07:00
* The returned reference must be put with __end_current_label_crit_section ( )
2017-06-09 02:08:28 -07:00
* This must NOT be used if the task cred could be updated within the
2017-06-09 08:14:28 -07:00
* critical section between __begin_current_label_crit_section ( ) . .
* __end_current_label_crit_section ( )
2017-06-09 02:08:28 -07:00
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * __begin_current_label_crit_section ( void )
2017-06-09 02:08:28 -07:00
{
2017-06-09 08:14:28 -07:00
struct aa_label * label = aa_current_raw_label ( ) ;
2017-06-09 02:08:28 -07:00
2017-06-09 08:14:28 -07:00
if ( label_is_stale ( label ) )
label = aa_get_newest_label ( label ) ;
2017-06-09 02:08:28 -07:00
2017-06-09 08:14:28 -07:00
return label ;
2017-06-09 02:08:28 -07:00
}
/**
2017-06-09 08:14:28 -07:00
* begin_current_label_crit_section - current ' s confining label and update it
2017-06-09 02:08:28 -07:00
*
2017-06-09 08:14:28 -07:00
* Returns : up to date confining label or the ns unconfined label ( NOT NULL )
2017-06-09 02:08:28 -07:00
*
* Not safe to call inside locks
*
2017-06-09 08:14:28 -07:00
* The returned reference must be put with end_current_label_crit_section ( )
2017-06-09 02:08:28 -07:00
* This must NOT be used if the task cred could be updated within the
2017-06-09 08:14:28 -07:00
* critical section between begin_current_label_crit_section ( ) . .
* end_current_label_crit_section ( )
2017-06-09 02:08:28 -07:00
*/
2017-06-09 08:14:28 -07:00
static inline struct aa_label * begin_current_label_crit_section ( void )
2017-06-09 02:08:28 -07:00
{
2017-06-09 08:14:28 -07:00
struct aa_label * label = aa_current_raw_label ( ) ;
2017-06-09 02:08:28 -07:00
2018-09-13 18:12:09 +02:00
might_sleep ( ) ;
2017-06-09 08:14:28 -07:00
if ( label_is_stale ( label ) ) {
label = aa_get_newest_label ( label ) ;
if ( aa_replace_current_label ( label ) = = 0 )
2017-06-09 02:08:28 -07:00
/* task cred will keep the reference */
2017-06-09 08:14:28 -07:00
aa_put_label ( label ) ;
2013-07-10 21:07:43 -07:00
}
2010-07-29 14:47:59 -07:00
2017-06-09 08:14:28 -07:00
return label ;
2010-07-29 14:47:59 -07:00
}
2017-01-16 00:42:50 -08:00
static inline struct aa_ns * aa_get_current_ns ( void )
{
2017-06-09 08:14:28 -07:00
struct aa_label * label ;
2017-06-09 02:08:28 -07:00
struct aa_ns * ns ;
2017-06-09 08:14:28 -07:00
label = __begin_current_label_crit_section ( ) ;
ns = aa_get_ns ( labels_ns ( label ) ) ;
__end_current_label_crit_section ( label ) ;
2017-06-09 02:08:28 -07:00
return ns ;
2017-01-16 00:42:50 -08:00
}
2010-07-29 14:47:59 -07:00
# endif /* __AA_CONTEXT_H */