Skip to content

Commit

Permalink
libselinux: accept const fromcon in get_context API
Browse files Browse the repository at this point in the history
Rework the APIs in <selinux/get_context_list.h> to take a constant
string as from context.

The passed string is not modified currently but not declared const,
which restricting callers (who care about const-correctness).

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
  • Loading branch information
cgzones authored and fishilico committed Jan 20, 2021
1 parent 316a4f8 commit e2dca5d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 37 deletions.
12 changes: 6 additions & 6 deletions libselinux/include/selinux/get_context_list.h
Expand Up @@ -17,14 +17,14 @@ extern "C" {
If 'fromcon' is NULL, defaults to current context.
Caller must free via freeconary. */
extern int get_ordered_context_list(const char *user,
char * fromcon,
const char *fromcon,
char *** list);

/* As above, but use the provided MLS level rather than the
default level for the user. */
extern int get_ordered_context_list_with_level(const char *user,
const char *level,
char * fromcon,
const char *fromcon,
char *** list);

/* Get the default security context for a user session for 'user'
Expand All @@ -35,22 +35,22 @@ extern "C" {
Returns 0 on success or -1 otherwise.
Caller must free via freecon. */
extern int get_default_context(const char *user,
char * fromcon,
const char *fromcon,
char ** newcon);

/* As above, but use the provided MLS level rather than the
default level for the user. */
extern int get_default_context_with_level(const char *user,
const char *level,
char * fromcon,
const char *fromcon,
char ** newcon);

/* Same as get_default_context, but only return a context
that has the specified role. If no reachable context exists
for the user with that role, then return -1. */
extern int get_default_context_with_role(const char *user,
const char *role,
char * fromcon,
const char *fromcon,
char ** newcon);

/* Same as get_default_context, but only return a context
Expand All @@ -59,7 +59,7 @@ extern "C" {
extern int get_default_context_with_rolelevel(const char *user,
const char *role,
const char *level,
char * fromcon,
const char *fromcon,
char ** newcon);

/* Given a list of authorized security contexts for the user,
Expand Down
12 changes: 6 additions & 6 deletions libselinux/man/man3/get_ordered_context_list.3
Expand Up @@ -7,17 +7,17 @@ get_ordered_context_list, get_ordered_context_list_with_level, get_default_conte
.br
.B #include <selinux/get_context_list.h>
.sp
.BI "int get_ordered_context_list(const char *" user ", char *" fromcon ", char ***" list );
.BI "int get_ordered_context_list(const char *" user ", const char *" fromcon ", char ***" list );
.sp
.BI "int get_ordered_context_list_with_level(const char *" user ", const char *" level ", char *" fromcon ", char ***" list );
.BI "int get_ordered_context_list_with_level(const char *" user ", const char *" level ", const char *" fromcon ", char ***" list );
.sp
.BI "int get_default_context(const char *" user ", char *" fromcon ", char **" newcon );
.BI "int get_default_context(const char *" user ", const char *" fromcon ", char **" newcon );
.sp
.BI "int get_default_context_with_level(const char *" user ", const char *" level ", char *" fromcon ", char **" newcon );
.BI "int get_default_context_with_level(const char *" user ", const char *" level ", const char *" fromcon ", char **" newcon );
.sp
.BI "int get_default_context_with_role(const char *" user ", const char *" role ", char *" fromcon ", char **" newcon ");
.BI "int get_default_context_with_role(const char *" user ", const char *" role ", const char *" fromcon ", char **" newcon ");
.sp
.BI "int get_default_context_with_rolelevel(const char *" user ", const char *" role ", const char *" level ", char *" fromcon ", char **" newcon ");
.BI "int get_default_context_with_rolelevel(const char *" user ", const char *" role ", const char *" level ", const char *" fromcon ", char **" newcon ");
.sp
.BI "int query_user_context(char **" list ", char **" newcon );
.sp
Expand Down
49 changes: 24 additions & 25 deletions libselinux/src/get_context_list.c
Expand Up @@ -13,7 +13,7 @@

int get_default_context_with_role(const char *user,
const char *role,
char * fromcon,
const char *fromcon,
char ** newcon)
{
char **conary;
Expand Down Expand Up @@ -56,23 +56,24 @@ int get_default_context_with_role(const char *user,
int get_default_context_with_rolelevel(const char *user,
const char *role,
const char *level,
char * fromcon,
const char *fromcon,
char ** newcon)
{

int rc = 0;
int freefrom = 0;
int rc;
char *backup_fromcon = NULL;
context_t con;
char *newfromcon;
const char *newfromcon;

if (!level)
return get_default_context_with_role(user, role, fromcon,
newcon);

if (!fromcon) {
rc = getcon(&fromcon);
rc = getcon(&backup_fromcon);
if (rc < 0)
return rc;
freefrom = 1;
fromcon = backup_fromcon;
}

rc = -1;
Expand All @@ -91,14 +92,13 @@ int get_default_context_with_rolelevel(const char *user,

out:
context_free(con);
if (freefrom)
freecon(fromcon);
freecon(backup_fromcon);
return rc;

}

int get_default_context(const char *user,
char * fromcon, char ** newcon)
const char *fromcon, char ** newcon)
{
char **conary;
int rc;
Expand Down Expand Up @@ -128,7 +128,7 @@ static int is_in_reachable(char **reachable, const char *usercon_str)
}

static int get_context_user(FILE * fp,
char * fromcon,
const char * fromcon,
const char * user,
char ***reachable,
unsigned int *nreachable)
Expand Down Expand Up @@ -345,22 +345,22 @@ static int get_failsafe_context(const char *user, char ** newcon)

int get_ordered_context_list_with_level(const char *user,
const char *level,
char * fromcon,
const char *fromcon,
char *** list)
{
int rc;
int freefrom = 0;
char *backup_fromcon = NULL;
context_t con;
char *newfromcon;
const char *newfromcon;

if (!level)
return get_ordered_context_list(user, fromcon, list);

if (!fromcon) {
rc = getcon(&fromcon);
rc = getcon(&backup_fromcon);
if (rc < 0)
return rc;
freefrom = 1;
fromcon = backup_fromcon;
}

rc = -1;
Expand All @@ -379,15 +379,14 @@ int get_ordered_context_list_with_level(const char *user,

out:
context_free(con);
if (freefrom)
freecon(fromcon);
freecon(backup_fromcon);
return rc;
}


int get_default_context_with_level(const char *user,
const char *level,
char * fromcon,
const char *fromcon,
char ** newcon)
{
char **conary;
Expand All @@ -405,23 +404,24 @@ int get_default_context_with_level(const char *user,
}

int get_ordered_context_list(const char *user,
char * fromcon,
const char *fromcon,
char *** list)
{
char **reachable = NULL;
int rc = 0;
unsigned nreachable = 0, freefrom = 0;
unsigned nreachable = 0;
char *backup_fromcon = NULL;
FILE *fp;
char *fname = NULL;
size_t fname_len;
const char *user_contexts_path = selinux_user_contexts_path();

if (!fromcon) {
/* Get the current context and use it for the starting context */
rc = getcon(&fromcon);
rc = getcon(&backup_fromcon);
if (rc < 0)
return rc;
freefrom = 1;
fromcon = backup_fromcon;
}

/* Determine the ordering to apply from the optional per-user config
Expand Down Expand Up @@ -469,8 +469,7 @@ int get_ordered_context_list(const char *user,
else
freeconary(reachable);

if (freefrom)
freecon(fromcon);
freecon(backup_fromcon);

return rc;

Expand Down

0 comments on commit e2dca5d

Please sign in to comment.