113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdio.h> 284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley 313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h> 413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <ctype.h> 513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <errno.h> 613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <limits.h> 713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/policydb.h> 984f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley 10bedef7d12493e5785537c1f8e46ce32c3e34bf32Stephen Smalley#ifndef __APPLE__ 1184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#include <stdio_ext.h> 1284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#endif 1384f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley 1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdarg.h> 1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "debug.h" 1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "private.h" 1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "dso.h" 1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "mls.h" 2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* -- Deprecated -- */ 2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid sepol_set_delusers(int on __attribute((unused))) 2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle WARN(NULL, "Deprecated interface"); 2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#undef BADLINE 2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define BADLINE() { \ 3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "invalid entry %s (%s:%u)", \ 3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle buffer, path, lineno); \ 3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle continue; \ 3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int load_users(struct policydb *policydb, const char *path) 3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle FILE *fp; 3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *buffer = NULL, *p, *q, oldc; 3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ssize_t nread; 4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle unsigned lineno = 0, islist = 0, bit; 4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle user_datum_t *usrdatum; 4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle role_datum_t *roldatum; 4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ebitmap_node_t *rnode; 4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fp = fopen(path, "r"); 4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (fp == NULL) 4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 49bedef7d12493e5785537c1f8e46ce32c3e34bf32Stephen Smalley#ifdef __APPLE__ 5084f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley if ((buffer = (char *)malloc(255 * sizeof(char))) == NULL) { 5184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley ERR(NULL, "out of memory"); 5284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley return -1; 5384f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley } 5484f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley 5584f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley while(fgets(buffer, 255, fp) != NULL) { 56d97cd6a2033c7f77c0cb5d9dfd77bdd2c7754a5bWilliam Roberts nread = strlen(buffer); 5784f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#else 5887c5afdad247ddc458cd0d9343bd5b03793b958cWilliam Roberts size_t len = 0; 5984f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley __fsetlocking(fp, FSETLOCKING_BYCALLER); 6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while ((nread = getline(&buffer, &len, fp)) > 0) { 6184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#endif 6284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley 6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle lineno++; 6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (buffer[nread - 1] == '\n') 6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle buffer[nread - 1] = 0; 6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p = buffer; 6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p) || *p == '#') 7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle continue; 7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (strncasecmp(p, "user", 4)) 7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p += 4; 7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*p)) 7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle q = p; 8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && !isspace(*p)) 8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *p++ = 0; 8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle usrdatum = hashtab_search(policydb->p_users.table, q); 8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (usrdatum) { 9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Replacing an existing user definition. */ 9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ebitmap_destroy(&usrdatum->roles.roles); 9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ebitmap_init(&usrdatum->roles.roles); 9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } else { 9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *id = strdup(q); 9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 96afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris if (!id) { 97afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris ERR(NULL, "out of memory"); 98afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris free(buffer); 99afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris fclose(fp); 100afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris return -1; 101afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris } 102afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris 10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Adding a new user definition. */ 104afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris usrdatum = malloc(sizeof(user_datum_t)); 105afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris if (!usrdatum) { 10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "out of memory"); 10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 108afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris free(id); 10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 112afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris 113afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris user_datum_init(usrdatum); 11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle usrdatum->s.value = ++policydb->p_users.nprim; 11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (hashtab_insert(policydb->p_users.table, 11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle id, (hashtab_datum_t) usrdatum)) { 11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "out of memory"); 11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 119afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris free(id); 120afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris user_datum_destroy(usrdatum); 121afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris free(usrdatum); 12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (strncasecmp(p, "roles", 5)) 13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p += 5; 13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*p)) 13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (*p == '{') { 14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle islist = 1; 14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } else 14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle islist = 0; 14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle oldc = 0; 14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle do { 14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle q = p; 15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && *p != ';' && *p != '}' && !isspace(*p)) 15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (*p == '}') 15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle islist = 0; 16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle oldc = *p; 16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *p++ = 0; 16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!q[0]) 16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle roldatum = hashtab_search(policydb->p_roles.table, q); 16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!roldatum) { 16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "undefined role %s (%s:%u)", 16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle q, path, lineno); 16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle continue; 17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Set the role and every role it dominates */ 17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ebitmap_for_each_bit(&roldatum->dominates, rnode, bit) { 17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (ebitmap_node_get_bit(rnode, bit)) 17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (ebitmap_set_bit 17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle (&usrdatum->roles.roles, bit, 1)) { 17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "out of memory"); 17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } while (islist); 18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (oldc == 0) 18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (policydb->mls) { 18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle context_struct_t context; 18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *scontext, *r, *s; 18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (strncasecmp(p, "level", 5)) 19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p += 5; 19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*p)) 19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle q = p; 20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && strncasecmp(p, "range", 5)) 20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *--p = 0; 20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle scontext = malloc(p - q); 21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!scontext) { 21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "out of memory"); 21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle r = scontext; 21913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle s = q; 22013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*s) { 22113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*s)) 22213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *r++ = *s; 22313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle s++; 22413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 22513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *r = 0; 22613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle r = scontext; 22713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 22813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle context_init(&context); 22913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (mls_context_to_sid(policydb, oldc, &r, &context) < 23013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 0) { 23113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "invalid level %s (%s:%u)", scontext, 23213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle path, lineno); 23313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(scontext); 23413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle continue; 23513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 23613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 23713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(scontext); 23813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle memcpy(&usrdatum->dfltlevel, &context.range.level[0], 23913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sizeof(usrdatum->dfltlevel)); 24013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 24113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (strncasecmp(p, "range", 5)) 24213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 24313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p += 5; 24413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*p)) 24513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 24613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && isspace(*p)) 24713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 24813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 24913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 25013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle q = p; 25113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*p && *p != ';') 25213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle p++; 25313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!(*p)) 25413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle BADLINE(); 25513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *p++ = 0; 25613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 25713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle scontext = malloc(p - q); 25813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!scontext) { 25913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "out of memory"); 26013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 26113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 26213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 26313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 26413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle r = scontext; 26513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle s = q; 26613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (*s) { 26713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!isspace(*s)) 26813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *r++ = *s; 26913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle s++; 27013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 27113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *r = 0; 27213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle r = scontext; 27313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 27413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle context_init(&context); 27513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (mls_context_to_sid(policydb, oldc, &r, &context) < 27613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 0) { 27713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "invalid range %s (%s:%u)", scontext, 27813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle path, lineno); 27913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(scontext); 28013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle continue; 28113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 28213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(scontext); 28313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle memcpy(&usrdatum->range, &context.range, 28413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sizeof(usrdatum->range)); 28513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 28613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 28713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 28813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(buffer); 28913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fclose(fp); 29013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return 0; 29113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 29213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 29313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint sepol_genusers(void *data, size_t len, 29413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const char *usersdir, void **newdata, size_t * newlen) 29513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 29613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle struct policydb policydb; 29713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char path[PATH_MAX]; 29813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 29913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Construct policy database */ 30013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (policydb_init(&policydb)) 30113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err; 30213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (policydb_from_image(NULL, data, len, &policydb) < 0) 30313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err; 30413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 30513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Load locally defined users. */ 30613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle snprintf(path, sizeof path, "%s/local.users", usersdir); 30713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (load_users(&policydb, path) < 0) 30813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err_destroy; 30913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 31013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Write policy database */ 31113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (policydb_to_image(NULL, &policydb, newdata, newlen) < 0) 31213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err_destroy; 31313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 31413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle policydb_destroy(&policydb); 31513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return 0; 31613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 31713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle err_destroy: 31813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle policydb_destroy(&policydb); 31913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 32013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle err: 32113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 32213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 32313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 32413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint hidden sepol_genusers_policydb(policydb_t * policydb, const char *usersdir) 32513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 32613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char path[PATH_MAX]; 32713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 32813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Load locally defined users. */ 32913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle snprintf(path, sizeof path, "%s/local.users", usersdir); 33013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (load_users(policydb, path) < 0) { 33113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "unable to load local.users: %s", strerror(errno)); 33213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 33313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 33413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 33513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (policydb_reindex_users(policydb) < 0) { 33613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(NULL, "unable to reindex users: %s", strerror(errno)); 33713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 33813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 33913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 34013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 34113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return 0; 34213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 34313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 34413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* -- End Deprecated -- */ 345