static bool initialize_properties() { FILE* file = fopen("/property_contexts", "re"); if (!file) { return false; } char* buffer = nullptr; size_t line_len; char* prop_prefix = nullptr; char* context = nullptr; while (getline(&buffer, &line_len, file) > 0) { int items = read_spec_entries(buffer, 2, &prop_prefix, &context); if (items <= 0) { continue; } if (items == 1) { free(prop_prefix); continue; } /* * init uses ctl.* properties as an IPC mechanism and does not write them * to a property file, therefore we do not need to create property files * to store them. */ if (!strncmp(prop_prefix, "ctl.", 4)) { free(prop_prefix); free(context); continue; } auto old_context = list_find( contexts, [context](context_node* l) { return !strcmp(l->context(), context); }); if (old_context) { list_add_after_len(&prefixes, prop_prefix, old_context); } else { list_add(&contexts, context, nullptr); list_add_after_len(&prefixes, prop_prefix, contexts); } free(prop_prefix); free(context); } free(buffer); fclose(file); return true; }
static int process_line(struct selabel_handle *rec, const char *path, char *line_buf, int pass, unsigned lineno) { int items; char *prop = NULL, *context = NULL; struct saved_data *data = (struct saved_data *)rec->data; spec_t *spec_arr = data->spec_arr; unsigned int nspec = data->nspec; const char *errbuf = NULL; items = read_spec_entries(line_buf, &errbuf, 2, &prop, &context); if (items < 0) { items = errno; selinux_log(SELINUX_ERROR, "%s: line %u error due to: %s\n", path, lineno, errbuf ?: strerror(errno)); errno = items; return -1; }