mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-25 02:55:33 +00:00
parent
0243610c09
commit
9aa466c773
@ -53,6 +53,16 @@ static void list_for_each(Node *node_ptr, const Func &fn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Node, class Func>
|
||||||
|
static Node *list_find(Node *node_ptr, const Func &fn) {
|
||||||
|
for (auto cur = node_ptr; cur; cur = cur->next) {
|
||||||
|
if (fn(cur)) {
|
||||||
|
return cur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
template <class Node, class Func>
|
template <class Node, class Func>
|
||||||
static void hash_for_each(Node **node_ptr, int n_slot, const Func &fn) {
|
static void hash_for_each(Node **node_ptr, int n_slot, const Func &fn) {
|
||||||
for (int i = 0; i < n_slot; ++i) {
|
for (int i = 0; i < n_slot; ++i) {
|
||||||
@ -502,8 +512,8 @@ bool sepol_impl::add_filename_trans(const char *s, const char *t, const char *c,
|
|||||||
key.tclass = cls->s.value;
|
key.tclass = cls->s.value;
|
||||||
key.name = (char *) o;
|
key.name = (char *) o;
|
||||||
|
|
||||||
filename_trans_datum_t *last = nullptr;
|
|
||||||
filename_trans_datum_t *trans = hashtab_find(db->filename_trans, (hashtab_key_t) &key);
|
filename_trans_datum_t *trans = hashtab_find(db->filename_trans, (hashtab_key_t) &key);
|
||||||
|
filename_trans_datum_t *last = nullptr;
|
||||||
while (trans) {
|
while (trans) {
|
||||||
if (ebitmap_get_bit(&trans->stypes, src->s.value - 1)) {
|
if (ebitmap_get_bit(&trans->stypes, src->s.value - 1)) {
|
||||||
// Duplicate, overwrite existing data and return
|
// Duplicate, overwrite existing data and return
|
||||||
@ -515,14 +525,17 @@ bool sepol_impl::add_filename_trans(const char *s, const char *t, const char *c,
|
|||||||
last = trans;
|
last = trans;
|
||||||
trans = trans->next;
|
trans = trans->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trans == nullptr) {
|
if (trans == nullptr) {
|
||||||
trans = auto_cast(calloc(sizeof(*trans), 1));
|
trans = auto_cast(calloc(sizeof(*trans), 1));
|
||||||
filename_trans_key_t *new_key = auto_cast(malloc(sizeof(*new_key)));
|
ebitmap_init(&trans->stypes);
|
||||||
*new_key = key;
|
|
||||||
new_key->name = strdup(key.name);
|
|
||||||
trans->next = last;
|
|
||||||
trans->otype = def->s.value;
|
trans->otype = def->s.value;
|
||||||
|
}
|
||||||
|
if (last) {
|
||||||
|
last->next = trans;
|
||||||
|
} else {
|
||||||
|
filename_trans_key_t *new_key = auto_cast(malloc(sizeof(*new_key)));
|
||||||
|
memcpy(new_key, &key, sizeof(key));
|
||||||
|
new_key->name = strdup(key.name);
|
||||||
hashtab_insert(db->filename_trans, (hashtab_key_t) new_key, trans);
|
hashtab_insert(db->filename_trans, (hashtab_key_t) new_key, trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,55 +551,31 @@ bool sepol_impl::add_genfscon(const char *fs_name, const char *path, const char
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate genfs context
|
// Find genfs node
|
||||||
ocontext_t *newc = auto_cast(calloc(sizeof(*newc), 1));
|
genfs_t *fs = list_find(db->genfs, [&](genfs_t *n) {
|
||||||
newc->u.name = strdup(path);
|
return strcmp(n->fstype, fs_name) == 0;
|
||||||
memcpy(&newc->context[0], ctx, sizeof(*ctx));
|
});
|
||||||
|
if (fs == nullptr) {
|
||||||
|
fs = auto_cast(calloc(sizeof(*fs), 1));
|
||||||
|
fs->fstype = strdup(fs_name);
|
||||||
|
fs->next = db->genfs;
|
||||||
|
db->genfs = fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find context node
|
||||||
|
ocontext_t *o_ctx = list_find(fs->head, [&](ocontext_t *n) {
|
||||||
|
return strcmp(n->u.name, path) == 0;
|
||||||
|
});
|
||||||
|
if (o_ctx == nullptr) {
|
||||||
|
o_ctx = auto_cast(calloc(sizeof(*o_ctx), 1));
|
||||||
|
o_ctx->u.name = strdup(path);
|
||||||
|
o_ctx->next = fs->head;
|
||||||
|
fs->head = o_ctx;
|
||||||
|
}
|
||||||
|
memset(o_ctx->context, 0, sizeof(o_ctx->context));
|
||||||
|
memcpy(&o_ctx->context[0], ctx, sizeof(*ctx));
|
||||||
free(ctx);
|
free(ctx);
|
||||||
|
|
||||||
// Find or allocate genfs
|
|
||||||
genfs_t *last_gen = nullptr;
|
|
||||||
genfs_t *newfs = nullptr;
|
|
||||||
for (genfs_t *node = db->genfs; node; node = node->next) {
|
|
||||||
if (strcmp(node->fstype, fs_name) == 0) {
|
|
||||||
newfs = node;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
last_gen = node;
|
|
||||||
}
|
|
||||||
if (newfs == nullptr) {
|
|
||||||
newfs = auto_cast(calloc(sizeof(*newfs), 1));
|
|
||||||
newfs->fstype = strdup(fs_name);
|
|
||||||
// Insert
|
|
||||||
if (last_gen)
|
|
||||||
last_gen->next = newfs;
|
|
||||||
else
|
|
||||||
db->genfs = newfs;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert or replace genfs context
|
|
||||||
ocontext_t *last_ctx = nullptr;
|
|
||||||
for (ocontext_t *node = newfs->head; node; node = node->next) {
|
|
||||||
if (strcmp(node->u.name, path) == 0) {
|
|
||||||
// Unlink
|
|
||||||
if (last_ctx)
|
|
||||||
last_ctx->next = node->next;
|
|
||||||
else
|
|
||||||
newfs->head = nullptr;
|
|
||||||
// Destroy old node
|
|
||||||
free(node->u.name);
|
|
||||||
context_destroy(&node->context[0]);
|
|
||||||
free(node);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
last_ctx = node;
|
|
||||||
}
|
|
||||||
// Insert
|
|
||||||
if (last_ctx)
|
|
||||||
last_ctx->next = newc;
|
|
||||||
else
|
|
||||||
newfs->head = newc;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user