|
Packit Service |
102278 |
/* Copyright (C) 2005 Red Hat, Inc. */
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
struct semanage_bool;
|
|
Packit Service |
102278 |
struct semanage_bool_key;
|
|
Packit Service |
102278 |
typedef struct semanage_bool record_t;
|
|
Packit Service |
102278 |
typedef struct semanage_bool_key record_key_t;
|
|
Packit Service |
102278 |
#define DBASE_RECORD_DEFINED
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
struct dbase_activedb;
|
|
Packit Service |
102278 |
typedef struct dbase_activedb dbase_t;
|
|
Packit Service |
102278 |
#define DBASE_DEFINED
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
#include <stdlib.h>
|
|
Packit Service |
102278 |
#include <string.h>
|
|
Packit Service |
102278 |
#include <selinux/selinux.h>
|
|
Packit Service |
102278 |
#include <semanage/handle.h>
|
|
Packit Service |
102278 |
#include "boolean_internal.h"
|
|
Packit Service |
102278 |
#include "database_activedb.h"
|
|
Packit Service |
102278 |
#include "parse_utils.h"
|
|
Packit Service |
102278 |
#include "debug.h"
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
static int bool_read_list(semanage_handle_t * handle,
|
|
Packit Service |
102278 |
semanage_bool_t *** booleans, unsigned int *count)
|
|
Packit Service |
102278 |
{
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
semanage_bool_t **tmp_booleans = NULL;
|
|
Packit Service |
102278 |
unsigned int tmp_count = 0;
|
|
Packit Service |
102278 |
int i;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
char **names = NULL;
|
|
Packit Service |
102278 |
int len = 0;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Fetch boolean names */
|
|
Packit Service |
102278 |
if (security_get_boolean_names(&names, &len) < 0) {
|
|
Packit Service |
102278 |
ERR(handle, "could not get list of boolean names");
|
|
Packit Service |
102278 |
goto err;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Allocate a sufficiently large array */
|
|
Packit Service |
102278 |
tmp_booleans = malloc(sizeof(semanage_bool_t *) * len);
|
|
Packit Service |
102278 |
if (tmp_booleans == NULL)
|
|
Packit Service |
102278 |
goto omem;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Create records one by one */
|
|
Packit Service |
102278 |
for (i = 0; i < len; i++) {
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
int value;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
if (semanage_bool_create(handle, &tmp_booleans[i]) < 0)
|
|
Packit Service |
102278 |
goto err;
|
|
Packit Service |
102278 |
tmp_count++;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
if (semanage_bool_set_name(handle,
|
|
Packit Service |
102278 |
tmp_booleans[i], names[i]) < 0)
|
|
Packit Service |
102278 |
goto err;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
value = security_get_boolean_active(names[i]);
|
|
Packit Service |
102278 |
if (value < 0) {
|
|
Packit Service |
102278 |
ERR(handle, "could not get the value "
|
|
Packit Service |
102278 |
"for boolean %s", names[i]);
|
|
Packit Service |
102278 |
goto err;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
semanage_bool_set_value(tmp_booleans[i], value);
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Success */
|
|
Packit Service |
102278 |
for (i = 0; i < len; i++)
|
|
Packit Service |
102278 |
free(names[i]);
|
|
Packit Service |
102278 |
free(names);
|
|
Packit Service |
102278 |
*booleans = tmp_booleans;
|
|
Packit Service |
102278 |
*count = tmp_count;
|
|
Packit Service |
102278 |
return STATUS_SUCCESS;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Failure */
|
|
Packit Service |
102278 |
omem:
|
|
Packit Service |
102278 |
ERR(handle, "out of memory");
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
err:
|
|
Packit Service |
102278 |
ERR(handle, "could not read boolean list");
|
|
Packit Service |
102278 |
for (i = 0; i < len; i++)
|
|
Packit Service |
102278 |
free(names[i]);
|
|
Packit Service |
102278 |
free(names);
|
|
Packit Service |
102278 |
for (i = 0; (unsigned int)i < tmp_count; i++)
|
|
Packit Service |
102278 |
semanage_bool_free(tmp_booleans[i]);
|
|
Packit Service |
102278 |
free(tmp_booleans);
|
|
Packit Service |
102278 |
return STATUS_ERR;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
static int bool_commit_list(semanage_handle_t * handle,
|
|
Packit Service |
102278 |
semanage_bool_t ** booleans, unsigned int count)
|
|
Packit Service |
102278 |
{
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
SELboolean *blist = NULL;
|
|
Packit Service |
102278 |
const char *name;
|
|
Packit Service |
102278 |
unsigned int bcount = 0;
|
|
Packit Service |
102278 |
unsigned int i;
|
|
Packit Service |
102278 |
int curvalue, newvalue;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Allocate a sufficiently large array */
|
|
Packit Service |
102278 |
blist = malloc(sizeof(SELboolean) * count);
|
|
Packit Service |
102278 |
if (blist == NULL)
|
|
Packit Service |
102278 |
goto omem;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Populate array */
|
|
Packit Service |
102278 |
for (i = 0; i < count; i++) {
|
|
Packit Service |
102278 |
name = semanage_bool_get_name(booleans[i]);
|
|
Packit Service |
102278 |
if (!name)
|
|
Packit Service |
102278 |
goto omem;
|
|
Packit Service |
102278 |
newvalue = semanage_bool_get_value(booleans[i]);
|
|
Packit Service |
102278 |
curvalue = security_get_boolean_active(name);
|
|
Packit Service |
102278 |
if (newvalue == curvalue)
|
|
Packit Service |
102278 |
continue;
|
|
Packit Service |
102278 |
blist[bcount].name = strdup(name);
|
|
Packit Service |
102278 |
if (blist[bcount].name == NULL)
|
|
Packit Service |
102278 |
goto omem;
|
|
Packit Service |
102278 |
blist[bcount].value = newvalue;
|
|
Packit Service |
102278 |
bcount++;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* Commit */
|
|
Packit Service |
102278 |
if (security_set_boolean_list(bcount, blist, 0) < 0) {
|
|
Packit Service |
102278 |
ERR(handle, "libselinux commit failed");
|
|
Packit Service |
102278 |
goto err;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
for (i = 0; i < bcount; i++)
|
|
Packit Service |
102278 |
free(blist[i].name);
|
|
Packit Service |
102278 |
free(blist);
|
|
Packit Service |
102278 |
return STATUS_SUCCESS;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
omem:
|
|
Packit Service |
102278 |
ERR(handle, "out of memory");
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
err:
|
|
Packit Service |
102278 |
ERR(handle, "could not commit boolean list");
|
|
Packit Service |
102278 |
for (i = 0; i < bcount; i++)
|
|
Packit Service |
102278 |
free(blist[i].name);
|
|
Packit Service |
102278 |
free(blist);
|
|
Packit Service |
102278 |
return STATUS_ERR;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
/* BOOL RECORD: ACTIVEDB extension: method table */
|
|
Packit Service |
102278 |
record_activedb_table_t SEMANAGE_BOOL_ACTIVEDB_RTABLE = {
|
|
Packit Service |
102278 |
.read_list = bool_read_list,
|
|
Packit Service |
102278 |
.commit_list = bool_commit_list,
|
|
Packit Service |
102278 |
};
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
int bool_activedb_dbase_init(semanage_handle_t * handle,
|
|
Packit Service |
102278 |
dbase_config_t * dconfig)
|
|
Packit Service |
102278 |
{
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
if (dbase_activedb_init(handle,
|
|
Packit Service |
102278 |
&SEMANAGE_BOOL_RTABLE,
|
|
Packit Service |
102278 |
&SEMANAGE_BOOL_ACTIVEDB_RTABLE,
|
|
Packit Service |
102278 |
&dconfig->dbase) < 0)
|
|
Packit Service |
102278 |
return STATUS_ERR;
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
dconfig->dtable = &SEMANAGE_ACTIVEDB_DTABLE;
|
|
Packit Service |
102278 |
return STATUS_SUCCESS;
|
|
Packit Service |
102278 |
}
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
void bool_activedb_dbase_release(dbase_config_t * dconfig)
|
|
Packit Service |
102278 |
{
|
|
Packit Service |
102278 |
|
|
Packit Service |
102278 |
dbase_activedb_release(dconfig->dbase);
|
|
Packit Service |
102278 |
}
|