1255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdio.h> 2b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley 3255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h> 4255e72915d4cbddceb435e13d81601755714e9fSE Android#include <ctype.h> 5255e72915d4cbddceb435e13d81601755714e9fSE Android#include <errno.h> 6255e72915d4cbddceb435e13d81601755714e9fSE Android#include <limits.h> 7255e72915d4cbddceb435e13d81601755714e9fSE Android 8255e72915d4cbddceb435e13d81601755714e9fSE Android#include <sepol/policydb/policydb.h> 9b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley 10b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#ifndef DARWIN 11b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#include <stdio_ext.h> 12b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#endif 13b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley 14255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdarg.h> 15255e72915d4cbddceb435e13d81601755714e9fSE Android 16255e72915d4cbddceb435e13d81601755714e9fSE Android#include "debug.h" 17255e72915d4cbddceb435e13d81601755714e9fSE Android#include "private.h" 18255e72915d4cbddceb435e13d81601755714e9fSE Android#include "dso.h" 19255e72915d4cbddceb435e13d81601755714e9fSE Android#include "mls.h" 20255e72915d4cbddceb435e13d81601755714e9fSE Android 21255e72915d4cbddceb435e13d81601755714e9fSE Android/* -- Deprecated -- */ 22255e72915d4cbddceb435e13d81601755714e9fSE Android 23255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_set_delusers(int on __attribute((unused))) 24255e72915d4cbddceb435e13d81601755714e9fSE Android{ 25255e72915d4cbddceb435e13d81601755714e9fSE Android WARN(NULL, "Deprecated interface"); 26255e72915d4cbddceb435e13d81601755714e9fSE Android} 27255e72915d4cbddceb435e13d81601755714e9fSE Android 28255e72915d4cbddceb435e13d81601755714e9fSE Android#undef BADLINE 29255e72915d4cbddceb435e13d81601755714e9fSE Android#define BADLINE() { \ 30255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "invalid entry %s (%s:%u)", \ 31255e72915d4cbddceb435e13d81601755714e9fSE Android buffer, path, lineno); \ 32255e72915d4cbddceb435e13d81601755714e9fSE Android continue; \ 33255e72915d4cbddceb435e13d81601755714e9fSE Android} 34255e72915d4cbddceb435e13d81601755714e9fSE Android 35255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic int load_users(struct policydb *policydb, const char *path) 36255e72915d4cbddceb435e13d81601755714e9fSE Android{ 37255e72915d4cbddceb435e13d81601755714e9fSE Android FILE *fp; 38255e72915d4cbddceb435e13d81601755714e9fSE Android char *buffer = NULL, *p, *q, oldc; 39255e72915d4cbddceb435e13d81601755714e9fSE Android size_t len = 0; 40255e72915d4cbddceb435e13d81601755714e9fSE Android ssize_t nread; 41255e72915d4cbddceb435e13d81601755714e9fSE Android unsigned lineno = 0, islist = 0, bit; 42255e72915d4cbddceb435e13d81601755714e9fSE Android user_datum_t *usrdatum; 43255e72915d4cbddceb435e13d81601755714e9fSE Android role_datum_t *roldatum; 44255e72915d4cbddceb435e13d81601755714e9fSE Android ebitmap_node_t *rnode; 45255e72915d4cbddceb435e13d81601755714e9fSE Android 46255e72915d4cbddceb435e13d81601755714e9fSE Android fp = fopen(path, "r"); 47255e72915d4cbddceb435e13d81601755714e9fSE Android if (fp == NULL) 48255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 49255e72915d4cbddceb435e13d81601755714e9fSE Android 50b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#ifdef DARWIN 51b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley if ((buffer = (char *)malloc(255 * sizeof(char))) == NULL) { 52b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley ERR(NULL, "out of memory"); 53b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley return -1; 54b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley } 55b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley 56b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley while(fgets(buffer, 255, fp) != NULL) { 57b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#else 58b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley __fsetlocking(fp, FSETLOCKING_BYCALLER); 59255e72915d4cbddceb435e13d81601755714e9fSE Android while ((nread = getline(&buffer, &len, fp)) > 0) { 60b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#endif 61b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley 62255e72915d4cbddceb435e13d81601755714e9fSE Android lineno++; 63255e72915d4cbddceb435e13d81601755714e9fSE Android if (buffer[nread - 1] == '\n') 64255e72915d4cbddceb435e13d81601755714e9fSE Android buffer[nread - 1] = 0; 65255e72915d4cbddceb435e13d81601755714e9fSE Android p = buffer; 66255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 67255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 68255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p) || *p == '#') 69255e72915d4cbddceb435e13d81601755714e9fSE Android continue; 70255e72915d4cbddceb435e13d81601755714e9fSE Android 71255e72915d4cbddceb435e13d81601755714e9fSE Android if (strncasecmp(p, "user", 4)) 72255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 73255e72915d4cbddceb435e13d81601755714e9fSE Android p += 4; 74255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*p)) 75255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 76255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 77255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 78255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 79255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 80255e72915d4cbddceb435e13d81601755714e9fSE Android q = p; 81255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && !isspace(*p)) 82255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 83255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 84255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 85255e72915d4cbddceb435e13d81601755714e9fSE Android *p++ = 0; 86255e72915d4cbddceb435e13d81601755714e9fSE Android 87255e72915d4cbddceb435e13d81601755714e9fSE Android usrdatum = hashtab_search(policydb->p_users.table, q); 88255e72915d4cbddceb435e13d81601755714e9fSE Android if (usrdatum) { 89255e72915d4cbddceb435e13d81601755714e9fSE Android /* Replacing an existing user definition. */ 90255e72915d4cbddceb435e13d81601755714e9fSE Android ebitmap_destroy(&usrdatum->roles.roles); 91255e72915d4cbddceb435e13d81601755714e9fSE Android ebitmap_init(&usrdatum->roles.roles); 92255e72915d4cbddceb435e13d81601755714e9fSE Android } else { 93255e72915d4cbddceb435e13d81601755714e9fSE Android char *id = strdup(q); 948fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley 95b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu if (!id) { 96b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu ERR(NULL, "out of memory"); 97b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu free(buffer); 98b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu fclose(fp); 99b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu return -1; 100b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu } 101255e72915d4cbddceb435e13d81601755714e9fSE Android 102255e72915d4cbddceb435e13d81601755714e9fSE Android /* Adding a new user definition. */ 1038fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley usrdatum = malloc(sizeof(user_datum_t)); 104b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu if (!usrdatum) { 105255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "out of memory"); 106255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 107b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu free(id); 108255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 109255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 110255e72915d4cbddceb435e13d81601755714e9fSE Android } 1118fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley 1128fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley user_datum_init(usrdatum); 113255e72915d4cbddceb435e13d81601755714e9fSE Android usrdatum->s.value = ++policydb->p_users.nprim; 114255e72915d4cbddceb435e13d81601755714e9fSE Android if (hashtab_insert(policydb->p_users.table, 115255e72915d4cbddceb435e13d81601755714e9fSE Android id, (hashtab_datum_t) usrdatum)) { 116255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "out of memory"); 117255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 118b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu free(id); 1198fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley user_datum_destroy(usrdatum); 120b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu free(usrdatum); 121255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 122255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 123255e72915d4cbddceb435e13d81601755714e9fSE Android } 124255e72915d4cbddceb435e13d81601755714e9fSE Android } 125255e72915d4cbddceb435e13d81601755714e9fSE Android 126255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 127255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 128255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 129255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 130255e72915d4cbddceb435e13d81601755714e9fSE Android if (strncasecmp(p, "roles", 5)) 131255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 132255e72915d4cbddceb435e13d81601755714e9fSE Android p += 5; 133255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*p)) 134255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 135255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 136255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 137255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 138255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 139255e72915d4cbddceb435e13d81601755714e9fSE Android if (*p == '{') { 140255e72915d4cbddceb435e13d81601755714e9fSE Android islist = 1; 141255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 142255e72915d4cbddceb435e13d81601755714e9fSE Android } else 143255e72915d4cbddceb435e13d81601755714e9fSE Android islist = 0; 144255e72915d4cbddceb435e13d81601755714e9fSE Android 145255e72915d4cbddceb435e13d81601755714e9fSE Android oldc = 0; 146255e72915d4cbddceb435e13d81601755714e9fSE Android do { 147255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 148255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 149255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 150255e72915d4cbddceb435e13d81601755714e9fSE Android break; 151255e72915d4cbddceb435e13d81601755714e9fSE Android 152255e72915d4cbddceb435e13d81601755714e9fSE Android q = p; 153255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && *p != ';' && *p != '}' && !isspace(*p)) 154255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 155255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 156255e72915d4cbddceb435e13d81601755714e9fSE Android break; 157255e72915d4cbddceb435e13d81601755714e9fSE Android if (*p == '}') 158255e72915d4cbddceb435e13d81601755714e9fSE Android islist = 0; 159255e72915d4cbddceb435e13d81601755714e9fSE Android oldc = *p; 160255e72915d4cbddceb435e13d81601755714e9fSE Android *p++ = 0; 161255e72915d4cbddceb435e13d81601755714e9fSE Android if (!q[0]) 162255e72915d4cbddceb435e13d81601755714e9fSE Android break; 163255e72915d4cbddceb435e13d81601755714e9fSE Android 164255e72915d4cbddceb435e13d81601755714e9fSE Android roldatum = hashtab_search(policydb->p_roles.table, q); 165255e72915d4cbddceb435e13d81601755714e9fSE Android if (!roldatum) { 166255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "undefined role %s (%s:%u)", 167255e72915d4cbddceb435e13d81601755714e9fSE Android q, path, lineno); 168255e72915d4cbddceb435e13d81601755714e9fSE Android continue; 169255e72915d4cbddceb435e13d81601755714e9fSE Android } 170255e72915d4cbddceb435e13d81601755714e9fSE Android /* Set the role and every role it dominates */ 171255e72915d4cbddceb435e13d81601755714e9fSE Android ebitmap_for_each_bit(&roldatum->dominates, rnode, bit) { 172255e72915d4cbddceb435e13d81601755714e9fSE Android if (ebitmap_node_get_bit(rnode, bit)) 173255e72915d4cbddceb435e13d81601755714e9fSE Android if (ebitmap_set_bit 174255e72915d4cbddceb435e13d81601755714e9fSE Android (&usrdatum->roles.roles, bit, 1)) { 175255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "out of memory"); 176255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 177255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 178255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 179255e72915d4cbddceb435e13d81601755714e9fSE Android } 180255e72915d4cbddceb435e13d81601755714e9fSE Android } 181255e72915d4cbddceb435e13d81601755714e9fSE Android } while (islist); 182255e72915d4cbddceb435e13d81601755714e9fSE Android if (oldc == 0) 183255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 184255e72915d4cbddceb435e13d81601755714e9fSE Android 185255e72915d4cbddceb435e13d81601755714e9fSE Android if (policydb->mls) { 186255e72915d4cbddceb435e13d81601755714e9fSE Android context_struct_t context; 187255e72915d4cbddceb435e13d81601755714e9fSE Android char *scontext, *r, *s; 188255e72915d4cbddceb435e13d81601755714e9fSE Android 189255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 190255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 191255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 192255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 193255e72915d4cbddceb435e13d81601755714e9fSE Android if (strncasecmp(p, "level", 5)) 194255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 195255e72915d4cbddceb435e13d81601755714e9fSE Android p += 5; 196255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*p)) 197255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 198255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 199255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 200255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 201255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 202255e72915d4cbddceb435e13d81601755714e9fSE Android q = p; 203255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && strncasecmp(p, "range", 5)) 204255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 205255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 206255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 207255e72915d4cbddceb435e13d81601755714e9fSE Android *--p = 0; 208255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 209255e72915d4cbddceb435e13d81601755714e9fSE Android 210255e72915d4cbddceb435e13d81601755714e9fSE Android scontext = malloc(p - q); 211255e72915d4cbddceb435e13d81601755714e9fSE Android if (!scontext) { 212255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "out of memory"); 213255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 214255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 215255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 216255e72915d4cbddceb435e13d81601755714e9fSE Android } 217255e72915d4cbddceb435e13d81601755714e9fSE Android r = scontext; 218255e72915d4cbddceb435e13d81601755714e9fSE Android s = q; 219255e72915d4cbddceb435e13d81601755714e9fSE Android while (*s) { 220255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*s)) 221255e72915d4cbddceb435e13d81601755714e9fSE Android *r++ = *s; 222255e72915d4cbddceb435e13d81601755714e9fSE Android s++; 223255e72915d4cbddceb435e13d81601755714e9fSE Android } 224255e72915d4cbddceb435e13d81601755714e9fSE Android *r = 0; 225255e72915d4cbddceb435e13d81601755714e9fSE Android r = scontext; 226255e72915d4cbddceb435e13d81601755714e9fSE Android 227255e72915d4cbddceb435e13d81601755714e9fSE Android context_init(&context); 228255e72915d4cbddceb435e13d81601755714e9fSE Android if (mls_context_to_sid(policydb, oldc, &r, &context) < 229255e72915d4cbddceb435e13d81601755714e9fSE Android 0) { 230255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "invalid level %s (%s:%u)", scontext, 231255e72915d4cbddceb435e13d81601755714e9fSE Android path, lineno); 232255e72915d4cbddceb435e13d81601755714e9fSE Android free(scontext); 233255e72915d4cbddceb435e13d81601755714e9fSE Android continue; 234255e72915d4cbddceb435e13d81601755714e9fSE Android 235255e72915d4cbddceb435e13d81601755714e9fSE Android } 236255e72915d4cbddceb435e13d81601755714e9fSE Android free(scontext); 237255e72915d4cbddceb435e13d81601755714e9fSE Android memcpy(&usrdatum->dfltlevel, &context.range.level[0], 238255e72915d4cbddceb435e13d81601755714e9fSE Android sizeof(usrdatum->dfltlevel)); 239255e72915d4cbddceb435e13d81601755714e9fSE Android 240255e72915d4cbddceb435e13d81601755714e9fSE Android if (strncasecmp(p, "range", 5)) 241255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 242255e72915d4cbddceb435e13d81601755714e9fSE Android p += 5; 243255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*p)) 244255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 245255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && isspace(*p)) 246255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 247255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 248255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 249255e72915d4cbddceb435e13d81601755714e9fSE Android q = p; 250255e72915d4cbddceb435e13d81601755714e9fSE Android while (*p && *p != ';') 251255e72915d4cbddceb435e13d81601755714e9fSE Android p++; 252255e72915d4cbddceb435e13d81601755714e9fSE Android if (!(*p)) 253255e72915d4cbddceb435e13d81601755714e9fSE Android BADLINE(); 254255e72915d4cbddceb435e13d81601755714e9fSE Android *p++ = 0; 255255e72915d4cbddceb435e13d81601755714e9fSE Android 256255e72915d4cbddceb435e13d81601755714e9fSE Android scontext = malloc(p - q); 257255e72915d4cbddceb435e13d81601755714e9fSE Android if (!scontext) { 258255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "out of memory"); 259255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 260255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 261255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 262255e72915d4cbddceb435e13d81601755714e9fSE Android } 263255e72915d4cbddceb435e13d81601755714e9fSE Android r = scontext; 264255e72915d4cbddceb435e13d81601755714e9fSE Android s = q; 265255e72915d4cbddceb435e13d81601755714e9fSE Android while (*s) { 266255e72915d4cbddceb435e13d81601755714e9fSE Android if (!isspace(*s)) 267255e72915d4cbddceb435e13d81601755714e9fSE Android *r++ = *s; 268255e72915d4cbddceb435e13d81601755714e9fSE Android s++; 269255e72915d4cbddceb435e13d81601755714e9fSE Android } 270255e72915d4cbddceb435e13d81601755714e9fSE Android *r = 0; 271255e72915d4cbddceb435e13d81601755714e9fSE Android r = scontext; 272255e72915d4cbddceb435e13d81601755714e9fSE Android 273255e72915d4cbddceb435e13d81601755714e9fSE Android context_init(&context); 274255e72915d4cbddceb435e13d81601755714e9fSE Android if (mls_context_to_sid(policydb, oldc, &r, &context) < 275255e72915d4cbddceb435e13d81601755714e9fSE Android 0) { 276255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "invalid range %s (%s:%u)", scontext, 277255e72915d4cbddceb435e13d81601755714e9fSE Android path, lineno); 278255e72915d4cbddceb435e13d81601755714e9fSE Android free(scontext); 279255e72915d4cbddceb435e13d81601755714e9fSE Android continue; 280255e72915d4cbddceb435e13d81601755714e9fSE Android } 281255e72915d4cbddceb435e13d81601755714e9fSE Android free(scontext); 282255e72915d4cbddceb435e13d81601755714e9fSE Android memcpy(&usrdatum->range, &context.range, 283255e72915d4cbddceb435e13d81601755714e9fSE Android sizeof(usrdatum->range)); 284255e72915d4cbddceb435e13d81601755714e9fSE Android } 285255e72915d4cbddceb435e13d81601755714e9fSE Android } 286255e72915d4cbddceb435e13d81601755714e9fSE Android 287255e72915d4cbddceb435e13d81601755714e9fSE Android free(buffer); 288255e72915d4cbddceb435e13d81601755714e9fSE Android fclose(fp); 289255e72915d4cbddceb435e13d81601755714e9fSE Android return 0; 290255e72915d4cbddceb435e13d81601755714e9fSE Android} 291255e72915d4cbddceb435e13d81601755714e9fSE Android 292255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_genusers(void *data, size_t len, 293255e72915d4cbddceb435e13d81601755714e9fSE Android const char *usersdir, void **newdata, size_t * newlen) 294255e72915d4cbddceb435e13d81601755714e9fSE Android{ 295255e72915d4cbddceb435e13d81601755714e9fSE Android struct policydb policydb; 296255e72915d4cbddceb435e13d81601755714e9fSE Android char path[PATH_MAX]; 297255e72915d4cbddceb435e13d81601755714e9fSE Android 298255e72915d4cbddceb435e13d81601755714e9fSE Android /* Construct policy database */ 299255e72915d4cbddceb435e13d81601755714e9fSE Android if (policydb_init(&policydb)) 300255e72915d4cbddceb435e13d81601755714e9fSE Android goto err; 301255e72915d4cbddceb435e13d81601755714e9fSE Android if (policydb_from_image(NULL, data, len, &policydb) < 0) 302255e72915d4cbddceb435e13d81601755714e9fSE Android goto err; 303255e72915d4cbddceb435e13d81601755714e9fSE Android 304255e72915d4cbddceb435e13d81601755714e9fSE Android /* Load locally defined users. */ 305255e72915d4cbddceb435e13d81601755714e9fSE Android snprintf(path, sizeof path, "%s/local.users", usersdir); 306255e72915d4cbddceb435e13d81601755714e9fSE Android if (load_users(&policydb, path) < 0) 307255e72915d4cbddceb435e13d81601755714e9fSE Android goto err_destroy; 308255e72915d4cbddceb435e13d81601755714e9fSE Android 309255e72915d4cbddceb435e13d81601755714e9fSE Android /* Write policy database */ 310255e72915d4cbddceb435e13d81601755714e9fSE Android if (policydb_to_image(NULL, &policydb, newdata, newlen) < 0) 311255e72915d4cbddceb435e13d81601755714e9fSE Android goto err_destroy; 312255e72915d4cbddceb435e13d81601755714e9fSE Android 313255e72915d4cbddceb435e13d81601755714e9fSE Android policydb_destroy(&policydb); 314255e72915d4cbddceb435e13d81601755714e9fSE Android return 0; 315255e72915d4cbddceb435e13d81601755714e9fSE Android 316255e72915d4cbddceb435e13d81601755714e9fSE Android err_destroy: 317255e72915d4cbddceb435e13d81601755714e9fSE Android policydb_destroy(&policydb); 318255e72915d4cbddceb435e13d81601755714e9fSE Android 319255e72915d4cbddceb435e13d81601755714e9fSE Android err: 320255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 321255e72915d4cbddceb435e13d81601755714e9fSE Android} 322255e72915d4cbddceb435e13d81601755714e9fSE Android 323255e72915d4cbddceb435e13d81601755714e9fSE Androidint hidden sepol_genusers_policydb(policydb_t * policydb, const char *usersdir) 324255e72915d4cbddceb435e13d81601755714e9fSE Android{ 325255e72915d4cbddceb435e13d81601755714e9fSE Android char path[PATH_MAX]; 326255e72915d4cbddceb435e13d81601755714e9fSE Android 327255e72915d4cbddceb435e13d81601755714e9fSE Android /* Load locally defined users. */ 328255e72915d4cbddceb435e13d81601755714e9fSE Android snprintf(path, sizeof path, "%s/local.users", usersdir); 329255e72915d4cbddceb435e13d81601755714e9fSE Android if (load_users(policydb, path) < 0) { 330255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "unable to load local.users: %s", strerror(errno)); 331255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 332255e72915d4cbddceb435e13d81601755714e9fSE Android } 333255e72915d4cbddceb435e13d81601755714e9fSE Android 334255e72915d4cbddceb435e13d81601755714e9fSE Android if (policydb_reindex_users(policydb) < 0) { 335255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(NULL, "unable to reindex users: %s", strerror(errno)); 336255e72915d4cbddceb435e13d81601755714e9fSE Android return -1; 337255e72915d4cbddceb435e13d81601755714e9fSE Android 338255e72915d4cbddceb435e13d81601755714e9fSE Android } 339255e72915d4cbddceb435e13d81601755714e9fSE Android 340255e72915d4cbddceb435e13d81601755714e9fSE Android return 0; 341255e72915d4cbddceb435e13d81601755714e9fSE Android} 342255e72915d4cbddceb435e13d81601755714e9fSE Android 343255e72915d4cbddceb435e13d81601755714e9fSE Android/* -- End Deprecated -- */ 344