1c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 2c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* Copyright (c) 2008-2009 Nall Design Works 3c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth Copyright 2006 Trusted Computer Solutions, Inc. */ 4c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 5c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* 6c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth Exported Interface 7c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 8c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int init_translations(void); 9c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth void finish_context_translations(void); 10c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int trans_context(const security_context_t, security_context_t *); 11c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int untrans_context(const security_context_t, security_context_t *); 12c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 13c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth*/ 14c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 15c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <math.h> 16c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <glob.h> 17c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <values.h> 18c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <unistd.h> 19c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <fcntl.h> 20c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <stdlib.h> 21c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <string.h> 22c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <stdio.h> 23c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <stdio_ext.h> 24c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <ctype.h> 25c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <selinux/selinux.h> 26c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <selinux/context.h> 27c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <syslog.h> 28c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <errno.h> 29c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <pcre.h> 30c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <ctype.h> 31c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <time.h> 32c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include <sys/time.h> 33c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 34c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 35c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include "mls_level.h" 36c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#include "mcstrans.h" 37c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 38c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#define N_BUCKETS 1453 39c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#define OVECCOUNT (512*3) 40c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 41c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#define log_error(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) 42c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 43c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 44c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#define log_debug(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) 45c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#else 46c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#define log_debug(fmt, ...) ; 47c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 48c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 49c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic unsigned int maxbit=0; 50c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 51c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* Define data structures */ 52c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct context_map { 53c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *raw; 54c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *trans; 55c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} context_map_t; 56c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 57c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct context_map_node { 58c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *key; 59c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_t *map; 60c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct context_map_node *next; 61c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} context_map_node_t; 62c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 63c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct affix { 64c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text; 65c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct affix *next; 66c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} affix_t; 67c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 68c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct word { 69c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text; 70c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t cat; 71c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t normal; 72c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t inverse; 73c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct word *next; 74c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} word_t; 75c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 76c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct word_group { 77c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *name; 78c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *whitespace; 79c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *join; 80c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 81c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *prefixes; 82c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *suffixes; 83c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *words; 84c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 85c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre *prefix_regexp; 86c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre *word_regexp; 87c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre *suffix_regexp; 88c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 89c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t def; 90c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 91c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t **sword; 92c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int sword_len; 93c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 94c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct word_group *next; 95c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} word_group_t; 96c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 97c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct base_classification { 98c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *trans; 99c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mls_level_t *level; 100c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct base_classification *next; 101c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} base_classification_t; 102c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 103c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct domain { 104c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *name; 105c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 106c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *raw_to_trans[N_BUCKETS]; 107c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *trans_to_raw[N_BUCKETS]; 108c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 109c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *base_classifications; 110c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *groups; 111c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 112c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre *base_classification_regexp; 113c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct domain *next; 114c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} domain_t; 115c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 116c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic domain_t *domains; 117c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 118c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct sens_constraint { 119c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char op; 120c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text; 121c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int sens; 122c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t cat; 123c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct sens_constraint *next; 124c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} sens_constraint_t; 125c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 126c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic sens_constraint_t *sens_constraints; 127c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 128c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtypedef struct cat_constraint { 129c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char op; 130c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text; 131c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int nbits; 132c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t mask; 133c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t cat; 134c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct cat_constraint *next; 135c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} cat_constraint_t; 136c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 137c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic cat_constraint_t *cat_constraints; 138c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 139c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothunsigned int 140c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothhash(const char *str) { 141c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int hash = 5381; 142c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int c; 143c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 144c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while ((c = *(unsigned const char *)str++)) 145c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth hash = ((hash << 5) + hash) + c; 146c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 147c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return hash; 148c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 149c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1507e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencestatic int 151c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothadd_to_hashtable(context_map_node_t **table, char *key, context_map_t *map) { 152c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int bucket = hash(key) % N_BUCKETS; 153c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t **n; 154c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (n = &table[bucket]; *n; n = &(*n)->next) 155c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 156c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *n = malloc(sizeof(context_map_node_t)); 157c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! *n) 158c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth goto err; 159c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (*n)->key = key; 160c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (*n)->map = map; 161c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (*n)->next = NULL; 1627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 163c89625db93f63f29a57451e692ae33ab24d49291Xavier Totherr: 164c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "add_to_hashtable: allocation error"); 1657e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 166c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 167c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1687e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencestatic int 1697e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencenumdigits(unsigned int n) 1707e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence{ 1717e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence int count = 1; 1727e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence while ((n = n / 10)) 1737e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence count++; 1747e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return count; 1757e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence} 1767e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 1777e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencestatic int 1787e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceparse_category(ebitmap_t *e, const char *raw, int allowinverse) 1797e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence{ 180c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int inverse = 0; 1817e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence unsigned int low, high; 182c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (*raw) { 1837e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (allowinverse && *raw == '~') { 1847e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence inverse = !inverse; 185c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth raw++; 186c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth continue; 187c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 188c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (sscanf(raw,"c%u", &low) != 1) 189c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 1907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence raw += numdigits(low) + 1; 191c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*raw == '.') { 192c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth raw++; 193c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (sscanf(raw,"c%u", &high) != 1) 194c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 1957e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence raw += numdigits(high) + 1; 1967e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } else { 1977e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence high = low; 1987e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 199c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (low <= high) { 2007e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (low >= maxbit) 2017e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence maxbit = low + 1; 2027e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_set_bit(e, low, inverse ? 0 : 1) < 0) 2037e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 204c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth low++; 205c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 2067e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (*raw == ',') { 2077e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence raw++; 2087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence inverse = 0; 2097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } else if (*raw != '\0') { 2107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 2117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 212c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 213c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 214c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 215c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 2167e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceint 2177e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceparse_ebitmap(ebitmap_t *e, ebitmap_t *def, const char *raw) { 2187e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence int rc = ebitmap_cpy(e, def); 2197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (rc < 0) 2207e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return rc; 2217e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence rc = parse_category(e, raw, 1); 2227e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (rc < 0) 2237e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return rc; 2247e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 2257e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence} 2267e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 2277e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencemls_level_t * 2287e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceparse_raw(const char *raw) { 2297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence mls_level_t *mls = calloc(1, sizeof(mls_level_t)); 2307e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!mls) 2317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 2327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (sscanf(raw,"s%u", &mls->sens) != 1) 2337e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 2347e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence raw += numdigits(mls->sens) + 1; 2357e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (*raw == ':') { 2367e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence raw++; 2377e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (parse_category(&mls->cat, raw, 0) < 0) 2387e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 2397e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } else if (*raw != '\0') { 2407e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 241c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 242c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 2437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return mls; 2447e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 2457e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 2467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_destroy(&mls->cat); 2477e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence free(mls); 2487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 249c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 250c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 251c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 252c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothdestroy_word(word_t **list, word_t *word) { 2537e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!word) { 2547e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return; 2557e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 256c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (; list && *list; list = &(*list)->next) { 257c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*list == word) { 258c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *list = word->next; 259c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 260c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 261c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 262c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(word->text); 263c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&word->cat); 264c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&word->normal); 265c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&word->inverse); 266c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(word, 0, sizeof(word_t)); 267c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(word); 268c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 269c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 2707e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceword_t * 2717e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencecreate_word(word_t **list, const char *text) { 2727e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence word_t *w = calloc(1, sizeof(word_t)); 2737e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!w) { 2747e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 2757e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 2767e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence w->text = strdup(text); 2777e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!w->text) { 2787e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 2797e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 280c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (list) { 281c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (; *list; list = &(*list)->next) 282c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 2837e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence *list = w; 284c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 285c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 2867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return w; 2877e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 2887e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 2897e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("create_word: allocation error %s", strerror(errno)); 2907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence destroy_word(NULL, w); 2917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 292c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 293c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 294c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 295c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothdestroy_group(word_group_t **list, word_group_t *group) { 296c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (; list && *list; list = &(*list)->next) { 297c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*list == group) { 298c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *list = group->next; 299c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 300c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 301c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 302c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(group->prefixes) { 303c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *next = group->prefixes->next; 304c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->prefixes->text); 305c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->prefixes); 306c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth group->prefixes=next; 307c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 308c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(group->suffixes) { 309c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *next = group->suffixes->next; 310c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->suffixes->text); 311c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->suffixes); 312c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth group->suffixes=next; 313c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 314c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(group->words) 315c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_word(&group->words, group->words); 316c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->whitespace); 317c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->name); 318c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->sword); 319c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group->join); 320c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free(group->prefix_regexp); 321c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free(group->word_regexp); 322c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free(group->suffix_regexp); 323c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&group->def); 324c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(group); 325c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 326c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 3277e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceword_group_t * 3287e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencecreate_group(word_group_t **list, const char *name) { 3297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence word_group_t *group = calloc(1, sizeof(word_group_t)); 3307e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!group) 3317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 3327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence group->name = strdup(name); 3337e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!group->name) { 3347e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 3357e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 3367e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence group->join = strdup(" "); 3377e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!group->join) { 3387e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 3397e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 3407e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence group->whitespace = strdup(" "); 3417e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!group->whitespace) { 3427e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 3437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 3447e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence group->sword = NULL; 345c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 3467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (list) { 3477e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence for (; *list; list = &(*list)->next) 3487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ; 3497e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence *list = group; 3507e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 351c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 3527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return group; 3537e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 3547e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 3557e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 3567e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence destroy_group(NULL, group); 3577e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 358c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 359c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 360c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 361c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothdestroy_domain(domain_t *domain) { 362c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int i; 363c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int rt = 0, tr = 0; 364c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i=0; i < N_BUCKETS; i++) { 365c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *ptr; 366c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (ptr = domain->trans_to_raw[i]; ptr;) { 367c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *t = ptr->next; 368c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ptr); 369c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ptr = t; 370c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth tr++; 371c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 372c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain->trans_to_raw[i] = NULL; 373c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 374c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i=0; i < N_BUCKETS; i++) { 375c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *ptr; 376c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (ptr = domain->raw_to_trans[i]; ptr;) { 377c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t *t = ptr->next; 378c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ptr->map->raw); 379c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ptr->map->trans); 380c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ptr->map); 381c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ptr); 382c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ptr = t; 383c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth rt++; 384c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 385c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain->raw_to_trans[i] = NULL; 386c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 387c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (domain->base_classifications) { 388c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *next = domain->base_classifications->next; 389c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(domain->base_classifications->trans); 390c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&domain->base_classifications->level->cat); 391c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(domain->base_classifications->level); 392c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(domain->base_classifications); 393c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain->base_classifications = next; 394c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 395c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free(domain->base_classification_regexp); 396c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (domain->groups) 397c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_group(&domain->groups, domain->groups); 398c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(domain->name); 399c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(domain); 400c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 401c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_INFO, "cache sizes: tr = %u, rt = %u", tr, rt); 402c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 403c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 4047e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencedomain_t * 4057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencecreate_domain(const char *name) { 4067e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence domain_t *domain = calloc(1, sizeof(domain_t)); 4077e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!domain) { 4087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 4097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 4107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence domain->name = strdup(name); 4117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!domain->name) { 4127e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 4137e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 4147e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 4157e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence domain_t **d = &domains; 4167e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence for (; *d; d = &(*d)->next) 4177e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ; 4187e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence *d = domain; 4197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 4207e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return domain; 4217e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 4227e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 4237e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 4247e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence destroy_domain(domain); 4257e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 4267e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence} 4277e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 428c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 429c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothadd_word(word_group_t *group, char *raw, char *trans) { 430c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (strchr(trans,'-')) { 431c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("'%s'is invalid because '-' is illegal in modifiers.\n", trans); 4327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 433c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 434c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *word = create_word(&group->words, trans); 435c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int rc = parse_ebitmap(&word->cat, &group->def, raw); 436c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (rc < 0) { 437c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error(" syntax error in %s\n", raw); 438c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_word(&group->words, word); 439c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 440c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 4412f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence if (ebitmap_andnot(&word->normal, &word->cat, &group->def, maxbit) < 0) 4427e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 443c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 444c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t temp; 4457e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_xor(&temp, &word->cat, &group->def) < 0) 4467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 4477e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&word->inverse, &temp, &group->def) < 0) 4487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 449c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&temp); 450c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 451c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 452c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 453c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 454c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 455c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothadd_constraint(char op, char *raw, char *tok) { 456c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug("%s\n", "add_constraint"); 457c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t empty; 458c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_init(&empty); 459c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!raw || !*raw) { 460c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse line"); 461c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 462c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 463c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*raw == 's') { 464c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sens_constraint_t *constraint = calloc(1, sizeof(sens_constraint_t)); 4657e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!constraint) { 4667e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 4677e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 4687e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 469c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (sscanf(raw,"s%u", &constraint->sens) != 1) { 470c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse level"); 471c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 472c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 473c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 474c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (parse_ebitmap(&constraint->cat, &empty, tok) < 0) { 475c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse cat"); 476c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 477c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 478c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 479c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&constraint->text, "%s%c%s", raw, op, tok) < 0) { 480c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 4817e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 482c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 483c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth constraint->op = op; 484c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sens_constraint_t **p; 485c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (p= &sens_constraints; *p; p = &(*p)->next) 486c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 487c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *p = constraint; 488c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 489c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (*raw == 'c' ) { 490c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth cat_constraint_t *constraint = calloc(1, sizeof(cat_constraint_t)); 4917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!constraint) { 4927e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 4937e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 4947e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 495c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (parse_ebitmap(&constraint->mask, &empty, raw) < 0) { 496c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse mask"); 497c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 498c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 499c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 500c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (parse_ebitmap(&constraint->cat, &empty, tok) < 0) { 501c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse cat"); 502c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&constraint->mask); 503c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 504c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 505c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 506c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&constraint->text, "%s%c%s", raw, op, tok) < 0) { 507c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 5087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 509c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 510c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth constraint->nbits = ebitmap_cardinality(&constraint->cat); 511c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth constraint->op = op; 512c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth cat_constraint_t **p; 513c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (p= &cat_constraints; *p; p = &(*p)->next) 514c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 515c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *p = constraint; 516c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 517c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 518c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 519c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 520c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 521c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 522c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 523c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 524c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 525c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothviolates_constraints(mls_level_t *l) { 526c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int nbits; 527c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sens_constraint_t *s; 528c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (s=sens_constraints; s; s=s->next) { 529c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (s->sens == l->sens) { 530c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t common; 5317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&common, &s->cat, &l->cat) < 0) 5327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 1; 533c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth nbits = ebitmap_cardinality(&common); 534c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&common); 535c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (nbits) { 536c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text = mls_level_to_string(l); 537c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_WARNING, "%s violates %s", text, s->text); 538c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(text); 539c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 1; 540c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 541c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 542c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 543c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth cat_constraint_t *c; 544c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (c=cat_constraints; c; c=c->next) { 545c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t common; 5467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&common, &c->mask, &l->cat) < 0) 5477e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 1; 548c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth nbits = ebitmap_cardinality(&common); 549c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&common); 550c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (nbits > 0) { 551c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t common; 5527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&common, &c->cat, &l->cat) < 0) 5537e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 1; 554c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth nbits = ebitmap_cardinality(&common); 555c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&common); 556c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if ((c->op == '!' && nbits) || 557c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (c->op == '>' && nbits != c->nbits)) { 558c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *text = mls_level_to_string(l); 559c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_WARNING, "%s violates %s (%d,%d)", text, c->text, nbits, c->nbits); 560c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(text); 561c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 1; 562c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 563c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 564c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 565c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 566c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 567c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 568c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 569c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothdestroy_sens_constraint(sens_constraint_t **list, sens_constraint_t *constraint) { 5707e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!constraint) { 5717e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return; 5727e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 573c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (; list && *list; list = &(*list)->next) { 574c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*list == constraint) { 575c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *list = constraint->next; 576c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 577c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 578c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 579c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&constraint->cat); 580c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint->text); 581c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(constraint, 0, sizeof(sens_constraint_t)); 582c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 583c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 584c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 585c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 586c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothdestroy_cat_constraint(cat_constraint_t **list, cat_constraint_t *constraint) { 5877e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!constraint) { 5887e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return; 5897e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 590c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (; list && *list; list = &(*list)->next) { 591c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*list == constraint) { 592c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *list = constraint->next; 593c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 594c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 595c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 596c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&constraint->mask); 597c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&constraint->cat); 598c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint->text); 599c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(constraint, 0, sizeof(cat_constraint_t)); 600c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(constraint); 601c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 602c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 603c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 604c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic int 605c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothadd_base_classification(domain_t *domain, char *raw, char *trans) { 606c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mls_level_t *level = parse_raw(raw); 607c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (level) { 608c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t **i; 609c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *base_classification = calloc(1, sizeof(base_classification_t)); 6107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!base_classification) { 6117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 6127e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 6137e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 614c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification->trans=strdup(trans); 6157e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!base_classification->trans) { 6167e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 6177e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence free(base_classification); 6187e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 6197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 620c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification->level=level; 621c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 622c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i=&domain->base_classifications; *i; i=&(*i)->next) 623c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 624c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *i = base_classification; 625c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 626c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 627c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error(" add_base_classification error %s %s\n", raw, trans); 628c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 629c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 630c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 6317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrencestatic int 632c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothadd_cache(domain_t *domain, char *raw, char *trans) { 6337e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence context_map_t *map = calloc(1, sizeof(context_map_t)); 634c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!map) goto err; 635c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 636c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth map->raw = strdup(raw); 6377e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!map->raw) { 6387e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 6397e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 640c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth map->trans = strdup(trans); 6417e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!map->trans) { 6427e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 6437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 644c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 645c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" add_cache (%s,%s)\n", raw, trans); 6467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_to_hashtable(domain->raw_to_trans, map->raw, map) < 0) 6477e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 6487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 6497e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_to_hashtable(domain->trans_to_raw, map->trans, map) < 0) 6507e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 6517e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 6527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 653c89625db93f63f29a57451e692ae33ab24d49291Xavier Totherr: 654c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("%s: allocation error", "add_cache"); 6557e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 656c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 657c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 658c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic context_map_t * 659c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothfind_in_table(context_map_node_t **table, const char *key) { 660c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int bucket = hash(key) % N_BUCKETS; 661c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_node_t **n; 662c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (n = &table[bucket]; *n; n = &(*n)->next) 663c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp((*n)->key, key)) 664c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return (*n)->map; 665c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return NULL; 666c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 667c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 668c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 669c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtrim(char *str, const char *whitespace) { 670c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *p = str + strlen(str); 671c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 672c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (p > str && strchr(whitespace, *(p-1)) != NULL) 673c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *--p = 0; 674c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return str; 675c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 676c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 677c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 678c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtriml(char *str, const char *whitespace) { 679c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *p = str; 680c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 681c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (*p && (strchr(whitespace, *p) != NULL)) 682c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth p++; 683c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return p; 684c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 685c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 6867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceint 6877e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceupdate(char **p, char *const val) { 688c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free (*p); 689c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *p = strdup(val); 6907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!*p) { 6917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 6927e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 6937e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 6947e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 695c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 696c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 6977e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceint 6987e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceappend(affix_t **affixes, const char *val) { 699c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *affix = calloc(1, sizeof(affix_t)); 7007e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!affix) { 7017e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 7027e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 703c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix->text = strdup(val); 7047e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!affix->text) 7057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 706c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (;*affixes; affixes = &(*affixes)->next) 707c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ; 708c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *affixes = affix; 7097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 7107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 7117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 7127e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 7137e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 714c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 715c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 716c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic int read_translations(const char *filename); 717c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 718c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* Process line from translation file. 719c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth Remove white space and set raw do data before the "=" and tok to data after it 720c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth Modifies the data pointed to by the buffer parameter 721c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth */ 722c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic int 723c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothprocess_trans(char *buffer) { 724c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth static domain_t *domain; 725c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth static word_group_t *group; 726c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth static int base_classification; 727c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth static int lineno = 0; 728c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char op='\0'; 729c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 730c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lineno++; 731c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug("%d: %s", lineno, buffer); 732c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 733c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* zap leading whitespace */ 734c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth buffer = triml(buffer, "\t "); 735c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 736c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* Ignore comments */ 737c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*buffer == '#') return 0; 738c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *comment = strpbrk (buffer, "#"); 739c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (comment) { 740c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *comment = '\0'; 741c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 742c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 743c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* zap trailing whitespace */ 744c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth buffer = trim(buffer, "\t \r\n"); 745c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 746c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*buffer == 0) return 0; 747c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 748c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *delim = strpbrk (buffer, "=!>"); 749c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! delim) { 750c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "invalid line (no !, = or >) %d", lineno); 751c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 752c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 753c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 754c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth op = *delim; 755c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *delim = '\0'; 756c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *raw = buffer; 757c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *tok = delim+1; 758c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 7597e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence /* remove trailing/leading whitespace from the split tokens */ 7607e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence trim(raw, "\t "); 7617e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence tok = triml(tok, "\t "); 7627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 763c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! *raw) { 764c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "invalid line %d", lineno); 765c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 766c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 767c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 768c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! *tok) { 769c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "invalid line %d", lineno); 770c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 771c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 772c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 773c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* constraints have different syntax */ 774c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (op == '!' || op == '>') { 775c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return add_constraint(op, raw, tok); 776c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 777c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 778c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp(raw, "Domain")) { 779c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain = create_domain(tok); 780c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth group = NULL; 781c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 782c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 783c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 784c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!domain) { 785c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain = create_domain("Default"); 7867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!domain) 7877e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 788c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth group = NULL; 789c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 790c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 791c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!group && 792c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (!strcmp(raw, "Whitespace") || !strcmp(raw, "Join") || 7937e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence !strcmp(raw, "Prefix") || !strcmp(raw, "Suffix") || 7947e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence !strcmp(raw, "Default"))) { 795c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "expected ModifierGroup declaration on line %d", lineno); 796c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 797c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 798c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 799c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp(raw, "Include")) { 800c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth unsigned int n; 801c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth glob_t g; 802c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g.gl_offs = 0; 803c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (glob(tok, GLOB_ERR, NULL, &g) < 0) { 804c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth globfree(&g); 8057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 806c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 807c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (n=0; n < g.gl_pathc; n++) { 808c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (read_translations(g.gl_pathv[n]) < 0) { 809c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth globfree(&g); 810c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 811c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 812c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 813c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth globfree(&g); 814c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Base")) { 815c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification = 1; 816c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "ModifierGroup")) { 817c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth group = create_group(&domain->groups, tok); 8187e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!group) 8197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 820c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification = 0; 821c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Whitespace")) { 8227e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (update (&group->whitespace, tok) < 0) 8237e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 824c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Join")) { 8257e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (update (&group->join, tok) < 0) 8267e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 827c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Prefix")) { 8287e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (append (&group->prefixes, tok) < 0) 8297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 830c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Suffix")) { 8317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (append (&group->suffixes, tok) < 0) 8327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 833c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (!strcmp(raw, "Default")) { 834c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t empty; 835c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_init(&empty); 836c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (parse_ebitmap(&group->def, &empty, tok) < 0) { 837c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to parse Default %d", lineno); 838c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 839c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 840c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else if (group) { 8417e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_word(group, raw, tok) < 0) { 8427e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence syslog(LOG_ERR, "unable to add base_classification on line %d", lineno); 8437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 8447e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 845c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 846c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (base_classification) { 847c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (add_base_classification(domain, raw, tok) < 0) { 848c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "unable to add base_classification on line %d", lineno); 849c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 850c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 851c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 8527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, raw, tok) < 0) 8537e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 854c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 855c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 856c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 857c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 858c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 859c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothread_translations(const char *filename) { 860c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth size_t size = 0; 861c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *buffer = NULL; 862c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int rval = 0; 863c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 864c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth FILE *cfg = fopen(filename,"r"); 865c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!cfg) { 866c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "%s file open failed", filename); 867c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 868c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 869c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 870c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth __fsetlocking(cfg, FSETLOCKING_BYCALLER); 871c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (getline(&buffer, &size, cfg) > 0) { 872c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if( process_trans(buffer) < 0 ) { 873c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "%s file read failed", filename); 874c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth rval = -1; 875c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 876c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 877c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 878c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(buffer); 879c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth fclose(cfg); 880c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return rval; 881c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 882c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 883c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 884c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothinit_translations(void) { 885c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (is_selinux_mls_enabled() <= 0) 886c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return -1; 887c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 888c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return(read_translations(selinux_translations_path())); 889c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 890c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 891c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 892c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothextract_range(const security_context_t incon) { 893c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_t con = context_new(incon); 894c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!con) { 895c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "extract_range context_new(%s) failed: %s", incon, strerror(errno)); 896c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return NULL; 897c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 898c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 899c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth const char *range = context_range_get(con); 900c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!range) { 901c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "extract_range: context_range_get(%s) failed: %m", incon); 902c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_free(con); 903c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return NULL; 904c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 905c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *r = strdup(range); 9067e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!r) { 9077e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("extract_range: allocation error %s", strerror(errno)); 9087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 9097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 910c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_free(con); 911c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return r; 912c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 913c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 914c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 915c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothnew_context_str(const security_context_t incon, const char *range) { 9167e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence char *rcon = NULL; 917c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_t con = context_new(incon); 918c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!con) { 9197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto exit; 920c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 921c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_range_set(con, range); 922c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth rcon = strdup(context_str(con)); 9237e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!rcon) { 9247e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto exit; 9257e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 9267e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 927c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return rcon; 9287e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 9297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceexit: 9307e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("new_context_str: %s %s", incon, strerror(errno)); 9317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 932c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 933c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 934c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 935c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothfind_in_hashtable(const char *range, domain_t *domain, context_map_node_t **table) { 936c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *trans = NULL; 937c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth context_map_t *map = find_in_table(table, range); 938c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (map) { 939c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth trans = strdup((table == domain->raw_to_trans) ? map->trans: map->raw); 9407e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!trans) { 9417e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("find_in_hashtable: allocation error %s", strerror(errno)); 9427e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 9437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 944c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" found %s in hashtable returning %s\n", range, trans); 945c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 946c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return trans; 947c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 948c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 949c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 950c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothemit_whitespace(char*buffer, char *whitespace) { 951c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, "["); 952c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, whitespace); 953c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, "]"); 954c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 955c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 956c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic int 957c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstring_size(const void *p1, const void *p2) { 958c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return strlen(*(char **)p2) - strlen(*(char **)p1); 959c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 960c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 961c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothstatic int 962c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothword_size(const void *p1, const void *p2) { 963c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w1 = *(word_t **)p1; 964c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w2 = *(word_t **)p2; 965c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int w1_len=strlen(w1->text); 966c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int w2_len=strlen(w2->text); 967c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (w1_len == w2_len) 968c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return strcmp(w1->text, w2->text); 969c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return (w2_len - w1_len); 970c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 971c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 972c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 973c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothbuild_regexp(pcre **r, char *buffer) { 974c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth const char *error; 975c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int error_offset; 976c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*r) 977c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free(*r); 978c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *r = pcre_compile(buffer, PCRE_CASELESS, &error, &error_offset, NULL); 979c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (error) { 980c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("pcre=%s, error=%s\n", buffer, error ? error: "none"); 981c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 982c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth buffer[0] = '\0'; 983c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 984c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 9857e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceint 986c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothbuild_regexps(domain_t *domain) { 987c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char buffer[1024 * 128]; 988c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth buffer[0] = '\0'; 989c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *bc; 990c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *g; 991c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth affix_t *a; 992c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w; 993c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth size_t n_el, i; 994c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 995c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (n_el = 0, bc = domain->base_classifications; bc; bc = bc->next) { 996c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth n_el++; 997c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 998c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 999c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char **sortable = calloc(n_el, sizeof(char *)); 10007e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!sortable) { 10017e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 10027e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 10037e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 1004c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1005c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i=0, bc = domain->base_classifications; bc; bc = bc->next) { 1006c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sortable[i++] = bc->trans; 1007c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1008c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1009c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth qsort(sortable, n_el, sizeof(char *), string_size); 1010c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1011c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i = 0; i < n_el; i++) { 1012c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, sortable[i]); 1013c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (i < n_el) strcat(buffer,"|"); 1014c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1015c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1016c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(sortable); 1017c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1018c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(">>> %s classification regexp=%s\n", domain->name, buffer); 1019c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth build_regexp(&domain->base_classification_regexp, buffer); 1020c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1021c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (g = domain->groups; g; g = g->next) { 1022c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->prefixes) { 1023c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"(?:"); 1024c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (a = g->prefixes; a; a = a->next) { 1025c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, a->text); 1026c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (a->next) strcat(buffer,"|"); 1027c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1028c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,")"); 1029c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"[ ]+"); 1030c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(">>> %s %s prefix regexp=%s\n", domain->name, g->name, buffer); 1031c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth build_regexp(&g->prefix_regexp, buffer); 1032c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1033c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1034c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->prefixes) 1035c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, "^"); 1036c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, "(?:"); 1037c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1038c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g->sword_len=0; 1039c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (w = g->words; w; w = w->next) 1040c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g->sword_len++; 1041c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1042c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g->sword = calloc(g->sword_len, sizeof(word_t *)); 10437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!g->sword) { 10447e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 10457e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 10467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 1047c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1048c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int i=0; 1049c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (w = g->words; w; w = w->next) 1050c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g->sword[i++]=w; 1051c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1052c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth qsort(g->sword, g->sword_len, sizeof(word_t *), word_size); 1053c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1054c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i=0; i < g->sword_len; i++) { 1055c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (i) strcat(buffer,"|"); 1056c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"\\b"); 1057c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, g->sword[i]->text); 1058c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"\\b"); 1059c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1060c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 10617e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (g->whitespace) { 10627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence strcat(buffer,"|["); 10637e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence strcat(buffer, g->whitespace); 10647e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence strcat(buffer, "]+"); 10657e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 1066c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1067c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, ")+"); 1068c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->suffixes) 1069c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, "$"); 1070c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1071c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(">>> %s %s modifier regexp=%s\n", domain->name, g->name, buffer); 1072c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth build_regexp(&g->word_regexp, buffer); 1073c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->suffixes) { 1074c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"[ ]+"); 1075c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,"(?:"); 1076c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (a = g->suffixes; a; a = a->next) { 1077c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, a->text); 1078c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (a->next) strcat(buffer,"|"); 1079c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1080c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer,")"); 1081c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(">>> %s %s suffix regexp=%s\n", domain->name, g->name, buffer); 1082c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth build_regexp(&g->suffix_regexp, buffer); 1083c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1084c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 10857e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 10867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return 0; 1087c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1088c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1089c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 1090c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothcompute_raw_from_trans(const char *level, domain_t *domain) { 1091c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1092c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1093c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval startTime; 1094c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&startTime, 0); 1095c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1096c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1097c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int ovector[OVECCOUNT]; 10987e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence word_group_t *g = NULL; 10997e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence char *work = NULL; 1100c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *r = NULL; 11017e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence const char * match = NULL; 11027e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence int work_len; 1103c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mls_level_t *mraw = NULL; 11047e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_t set, clear, tmp; 11057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 11067e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&set); 11077e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&clear); 11087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&tmp); 11097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 11107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence work = strdup(level); 11117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!work) { 11127e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("compute_raw_from_trans: allocation error %s", strerror(errno)); 11137e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 11147e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 11157e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence work_len = strlen(work); 1116c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1117c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!domain->base_classification_regexp) 11187e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (build_regexps(domain) < 0) 11197e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1120c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!domain->base_classification_regexp) 11217e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1122c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_raw_from_trans work = %s\n", work); 11237e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence int rc = pcre_exec(domain->base_classification_regexp, 0, work, work_len, 0, PCRE_ANCHORED, ovector, OVECCOUNT); 1124c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (rc > 0) { 11257e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence match = NULL; 1126c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_get_substring(work, ovector, rc, 0, &match); 11277e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_debug(" compute_raw_from_trans match = %s len = %u\n", match, strlen(match)); 1128c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *bc; 1129c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (bc = domain->base_classifications; bc; bc = bc->next) { 1130c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp(bc->trans, match)) { 1131c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_raw_from_trans base classification %s matched %s\n", level, bc->trans); 1132c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mraw = malloc(sizeof(mls_level_t)); 11337e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!mraw) { 11347e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("allocation error %s", strerror(errno)); 11357e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 11367e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 11377e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (mls_level_cpy(mraw, bc->level) < 0) 11387e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1139c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1140c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1141c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1142c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1143c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(work + ovector[0], '#', ovector[1] - ovector[0]); 1144c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *p=work + ovector[0] + ovector[1]; 1145c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (*p && (strchr(" ", *p) != NULL)) 1146c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *p++ = '#'; 1147c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free((char *)match); 11487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence match = NULL; 1149c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1150c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_raw_from_trans no base classification matched %s\n", level); 1151c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1152c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1153c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (mraw == NULL) { 11547e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1155c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1156c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1157c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int complete = 0; 1158c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int change = 1; 1159c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(change && !complete) { 1160c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth change = 0; 1161c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (g = domain->groups; g && !change && !complete; g = g->next) { 1162c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int prefix = 0, suffix = 0; 1163c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int prefix_offset = 0, prefix_len = 0; 1164c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int suffix_offset = 0, suffix_len = 0; 1165c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->prefix_regexp) { 1166c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int rc = pcre_exec(g->prefix_regexp, 0, work, work_len, 0, 0, ovector, OVECCOUNT); 1167c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (rc > 0) { 1168c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth prefix = 1; 1169c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth prefix_offset = ovector[0]; 1170c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth prefix_len = ovector[1] - ovector[0]; 1171c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1172c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1173c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->suffix_regexp) { 1174c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int rc = pcre_exec(g->suffix_regexp, 0, work, work_len, 0, 0, ovector, OVECCOUNT); 1175c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (rc > 0) { 1176c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth suffix = 1; 1177c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth suffix_offset = ovector[0]; 1178c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth suffix_len = ovector[1] - ovector[0]; 1179c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1180c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1181c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1182c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* anchors prefix ^, suffix $ */ 1183c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (((!g->prefixes && !g->suffixes) || 1184c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (g->prefixes && prefix) || 1185c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth (g->suffixes && suffix)) && 1186c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth g->word_regexp) { 1187c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *s = work + prefix_offset + prefix_len; 1188c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int l = (suffix_len ? suffix_offset : work_len) - prefix_len - prefix_offset; 1189c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int rc = pcre_exec(g->word_regexp, 0, s, l, 0, 0, ovector, OVECCOUNT); 1190c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (rc > 0) { 11917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence match = NULL; 1192c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_get_substring(s, ovector, rc, 0, &match); 1193c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth trim((char *)match, g->whitespace); 1194c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (*match) { 1195c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *p = triml((char *)match, g->whitespace); 1196c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (p && *p) { 1197c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int plen = strlen(p); 1198c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int i; 1199c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (i = 0; i < g->sword_len; i++) { 1200c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w = g->sword[i]; 1201c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int wlen = strlen(w->text); 1202c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (plen >= wlen && !strncmp(w->text, p, strlen(w->text))){ 12032f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence if (ebitmap_andnot(&set, &w->cat, &g->def, maxbit) < 0) goto err; 1204c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 12057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_xor(&tmp, &w->cat, &g->def) < 0) goto err; 12067e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&clear, &tmp, &g->def) < 0) goto err; 12077e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_union(&mraw->cat, &set) < 0) goto err; 1208c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1209c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&tmp); 12107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_cpy(&tmp, &mraw->cat) < 0) goto err; 1211c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&mraw->cat); 12122f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence if (ebitmap_andnot(&mraw->cat, &tmp, &clear, maxbit) < 0) goto err; 1213c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1214c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&tmp); 1215c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&set); 1216c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&clear); 1217c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth p += strlen(w->text); 1218c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth change++; 1219c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1220c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1221c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1222c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (i == g->sword_len) { 1223c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "conversion error"); 1224c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1225c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1226c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth p = triml(p, g->whitespace); 1227c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1228c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(work + prefix_offset, '#', prefix_len); 1229c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(work + suffix_offset, '#', suffix_len); 1230c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth memset(s + ovector[0], '#', ovector[1] - ovector[0]); 1231c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1232c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth pcre_free((void *)match); 12337e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence match = NULL; 1234c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1235c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1236c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* YYY */ 1237c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth complete=1; 1238c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *p = work; 1239c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(*p) { 1240c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (isalnum(*p++)) { 1241c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth complete=0; 1242c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1243c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1244c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1245c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1246c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1247c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(work); 1248c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (violates_constraints(mraw)) { 1249c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth complete = 0; 1250c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1251c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (complete) 1252c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth r = mls_level_to_string(mraw); 1253c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mls_level_destroy(mraw); 1254c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(mraw); 1255c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1256c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1257c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval stopTime; 1258c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&stopTime, 0); 1259c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth long int ms; 1260c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (startTime.tv_usec > stopTime.tv_usec) 1261c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec - 1) * 1000 + (stopTime.tv_usec/1000 + 1000 - startTime.tv_usec/1000); 1262c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth else 1263c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec ) * 1000 + (stopTime.tv_usec/1000 - startTime.tv_usec/1000); 1264c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_raw_from_trans in %ld ms'\n", ms); 1265c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1266c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1267c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return r; 12687e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 12697e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 12707e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence mls_level_destroy(mraw); 12717e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence free(mraw); 12727e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence free(work); 12737e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence pcre_free((void *)match); 12747e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_destroy(&tmp); 12757e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_destroy(&set); 12767e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_destroy(&clear); 12777e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 1278c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1279c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1280c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothchar * 1281c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothcompute_trans_from_raw(const char *level, domain_t *domain) { 1282c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1283c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1284c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval startTime; 1285c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&startTime, 0); 1286c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1287c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 12887e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence mls_level_t *l = NULL; 1289c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *rval = NULL; 12907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_t bit_diff, temp, handled, nothandled, unhandled, orig_unhandled; 12917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 12927e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&bit_diff); 12937e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&temp); 12947e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&handled); 12957e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(¬handled); 12967e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&unhandled); 12977e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence ebitmap_init(&orig_unhandled); 12987e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 1299c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!level) 13007e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 13017e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 13027e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence l = parse_raw(level); 1303c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!l) 13047e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1305c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_trans_from_raw raw = %s\n", level); 1306c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1307c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth/* YYY */ 1308c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* check constraints */ 1309c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (violates_constraints(l)) { 1310c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth syslog(LOG_ERR, "%s violates constraints", level); 13117e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1312c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1313c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1314c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int doInverse = l->sens > 0; 1315c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1316c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *groups = NULL; 1317c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth base_classification_t *bc, *last = NULL; 1318c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int done = 0; 1319c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (bc = domain->base_classifications; bc && !done; bc = bc->next) { 1320c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (l->sens == bc->level->sens) { 1321c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* skip if alias of last bc */ 1322c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (last && 1323c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth last->level->sens == bc->level->sens && 1324c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_cmp(&last->level->cat, &bc->level->cat) == 0) 1325c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth continue; 1326c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1327c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* compute bits not consumed by base classification */ 1328c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t unhandled, orig_unhandled; 13297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_xor(&unhandled, &l->cat, &bc->level->cat) < 0) 13307e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 13317e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_cpy(&orig_unhandled, &unhandled) < 0) 13327e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1333c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1334c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* prebuild groups */ 1335c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *g; 1336c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (g = domain->groups; g; g = g->next) { 1337c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t **t; 1338c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (t = &groups; *t; t = &(*t)->next) 1339c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp(g->name, (*t)->name)) 1340c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1341c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1342c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! *t) { 1343c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *wg = create_group(&groups, g->name); 1344c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->prefixes) 13457e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (append(&wg->prefixes, g->prefixes->text) < 0) 13467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1347c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->suffixes) 13487e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (append(&wg->suffixes, g->suffixes->text) < 0) 13497e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1350c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->join) 13517e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (update(&wg->join, g->join) < 0) 13527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1353c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1354c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1355c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1356c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int loops, hamming, change=1; 1357c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (loops = 50; ebitmap_cardinality(&unhandled) && loops > 0 && change; loops--) { 1358c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth change = 0; 1359c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth hamming = 10000; 1360c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t handled, nothandled; 13617e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_xor(&handled, &unhandled, &orig_unhandled) < 0) 13627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 13632f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence if (ebitmap_not(¬handled, &handled, maxbit) < 0) 13647e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1365c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *currentGroup = NULL; 1366c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *currentWord = NULL; 1367c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (g = domain->groups; g && hamming; g = g->next) { 1368c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w; 1369c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (w = g->words; w && hamming; w = w->next) { 1370c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth int cardinality = ebitmap_cardinality(&w->normal); 1371c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* If the word is all inverse bits and the level does not have inverse bits - skip */ 1372c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (cardinality && !doInverse) { 1373c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth continue; 1374c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1375c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1376c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* if only unhandled bits are different */ 1377c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t temp; 1378c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t bit_diff; 13797e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_or(&temp, &w->normal, &w->inverse) < 0) 13807e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 13817e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&bit_diff, &temp, ¬handled) < 0) 13827e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1383c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&temp); 1384c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth// xor bit_diff handled? 13857e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_and(&temp, &bit_diff, &unhandled) < 0) 13867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1387c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (ebitmap_cmp(&bit_diff, &temp)) { 13882f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence int h = ebitmap_hamming_distance(&bit_diff, &unhandled); 1389c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (h < hamming) { 1390c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth hamming = h; 1391c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth currentGroup = g; 1392c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth currentWord = w; 1393c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1394c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1395c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&bit_diff); 1396c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&temp); 1397c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1398c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1399c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&handled); 1400c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(¬handled); 1401c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1402c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (currentWord) { 1403c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t bit_diff; 14047e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_xor(&bit_diff, ¤tWord->cat, &bc->level->cat) < 0) 14057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1406c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1407c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_t temp; 14087e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ebitmap_cpy(&temp, &unhandled) < 0) 14097e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1410c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&unhandled); 14112f68def6338d072ae13328cf6357a4468408ce1bSteve Lawrence if (ebitmap_andnot(&unhandled, &temp, &bit_diff, maxbit) < 0) 14127e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 1413c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1414c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&bit_diff); 1415c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&temp); 1416c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1417c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t **t; 1418c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (t = &groups; *t; t = &(*t)->next) 1419c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!strcmp(currentGroup->name, (*t)->name)) 1420c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1421c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth create_word(&(*t)->words, currentWord->text); 1422c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth change++; 1423c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1424c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1425c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1426c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth done = (ebitmap_cardinality(&unhandled) == 0); 1427c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&unhandled); 1428c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ebitmap_destroy(&orig_unhandled); 1429c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (done) { 1430c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char buffer[9999]; 1431c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth buffer[0] = 0; 1432c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, bc->trans); 1433c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, " "); 1434c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *g; 1435c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (g=groups; g; g = g->next) { 1436c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->words && g->prefixes) { 1437c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, g->prefixes->text); 1438c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, " "); 1439c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1440c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_t *w; 1441c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (w=g->words; w; w = w->next) { 1442c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, w->text); 1443c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (w->next) 1444c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, g->join); 1445c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1446c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (g->words && g->suffixes) { 1447c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, " "); 1448c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, g->suffixes->text); 1449c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1450c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth word_group_t *n = g->next; 1451c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(g->words && n) { 1452c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (n->words) { 1453c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth strcat(buffer, " "); 1454c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1455c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1456c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth n = n->next; 1457c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1458c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1459c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth rval = strdup(buffer); 14607e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (!rval) { 14617e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence log_error("compute_trans_from_raw: allocation error %s", strerror(errno)); 14627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence goto err; 14637e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 1464c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1465c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* clean up */ 1466c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while (groups) 1467c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_group(&groups, groups); 1468c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1469c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth last = bc; 1470c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1471c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (l) { 1472c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth mls_level_destroy(l); 1473c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(l); 1474c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1475c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1476c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1477c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval stopTime; 1478c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&stopTime, 0); 1479c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth long int ms; 1480c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (startTime.tv_usec > stopTime.tv_usec) 1481c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec - 1) * 1000 + (stopTime.tv_usec/1000 + 1000 - startTime.tv_usec/1000); 1482c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth else 1483c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec ) * 1000 + (stopTime.tv_usec/1000 - startTime.tv_usec/1000); 1484c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1485c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" compute_trans_from_raw in %ld ms'\n", ms); 1486c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1487c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1488c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return rval; 14897e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence 14907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrenceerr: 14917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence while (groups) 14927e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence destroy_group(&groups, groups); 14937e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence mls_level_destroy(l); 14947e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence free(l); 14957e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return NULL; 1496c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1497c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1498c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 1499c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothtrans_context(const security_context_t incon, security_context_t *rcon) { 1500c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *trans = NULL; 1501c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = NULL; 1502c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1503c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1504c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval startTime; 1505c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&startTime, 0); 1506c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1507c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1508c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" trans_context input = %s\n", incon); 1509c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *range = extract_range(incon); 1510c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!range) return -1; 1511c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1512c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain_t *domain = domains; 1513c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (;domain; domain = domain->next) { 1514c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth trans = find_in_hashtable(range, domain, domain->raw_to_trans); 1515c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (trans) break; 1516c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1517c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* try split and translate */ 1518c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *lrange = NULL, *urange = NULL; 1519c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *ltrans = NULL, *utrans = NULL; 1520c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *dashp = strchr(range,'-'); 1521c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (dashp) { 1522c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = 0; 1523c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lrange = range; 1524c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth urange = dashp+1; 1525c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1526c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth trans = compute_trans_from_raw(range, domain); 1527c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (trans) 15287e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, range, trans) < 0) 15297e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1530c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1531c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1532c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (lrange && urange) { 1533c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ltrans = find_in_hashtable(lrange, domain, domain->raw_to_trans); 1534c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! ltrans) { 1535c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ltrans = compute_trans_from_raw(lrange, domain); 15367e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (ltrans) { 15377e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, lrange, ltrans) < 0) 15387e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 15397e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } else { 1540c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ltrans = strdup(lrange); 1541c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! ltrans) { 1542c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("strdup failed %s", strerror(errno)); 15437e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1544c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1545c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1546c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1547c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1548c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth utrans = find_in_hashtable(urange, domain, domain->raw_to_trans); 1549c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! utrans) { 1550c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth utrans = compute_trans_from_raw(urange, domain); 15517e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (utrans) { 15527e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, urange, utrans) < 0) 15537e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 15547e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } else { 1555c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth utrans = strdup(urange); 1556c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! utrans) { 1557c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("strdup failed %s", strerror(errno)); 15587e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1559c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1560c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1561c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1562c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1563c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (strcmp(ltrans, utrans) == 0) { 1564c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&trans, "%s", ltrans) < 0) { 1565c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 15667e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1567c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1568c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1569c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&trans, "%s-%s", ltrans, utrans) < 0) { 1570c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 15717e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1572c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1573c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1574c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(ltrans); 1575c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(utrans); 1576c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = '-'; 1577c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1578c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1579c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (dashp) 1580c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = '-'; 1581c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1582c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1583c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (trans) { 1584c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = new_context_str(incon, trans); 1585c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(trans); 1586c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1587c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = new_context_str(incon, range); 1588c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1589c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(range); 1590c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1591c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1592c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval stopTime; 1593c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&stopTime, 0); 1594c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth long int ms; 1595c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (startTime.tv_usec > stopTime.tv_usec) 1596c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec - 1) * 1000 + (stopTime.tv_usec/1000 + 1000 - startTime.tv_usec/1000); 1597c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth else 1598c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec ) * 1000 + (stopTime.tv_usec/1000 - startTime.tv_usec/1000); 1599c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1600c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" trans_context input='%s' output='%s in %ld ms'\n", incon, *rcon, ms); 1601c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1602c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 1603c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1604c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1605c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothint 1606c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothuntrans_context(const security_context_t incon, security_context_t *rcon) { 1607c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *raw = NULL; 1608c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = NULL; 1609c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1610c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1611c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval startTime; 1612c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&startTime, 0); 1613c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1614c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1615c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" untrans_context incon = %s\n", incon); 1616c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *range = extract_range(incon); 1617c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!range) return -1; 1618c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" untrans_context range = %s\n", range); 1619c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1620c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain_t *domain = domains; 1621c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth for (;domain; domain = domain->next) { 1622c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth raw = find_in_hashtable(range, domain, domain->trans_to_raw); 1623c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (raw) break; 1624c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1625c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth /* try split and translate */ 1626c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *lrange = NULL, *urange = NULL; 1627c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *lraw = NULL, *uraw = NULL; 1628c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *dashp = strchr(range,'-'); 1629c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (dashp) { 1630c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = 0; 1631c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lrange = range; 1632c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth urange = dashp+1; 1633c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1634c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth raw = compute_raw_from_trans(range, domain); 1635c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (raw) { 1636c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *canonical = find_in_hashtable(raw, domain, domain->raw_to_trans); 1637c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!canonical) { 1638c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth canonical = compute_trans_from_raw(raw, domain); 1639c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical && strcmp(canonical, range)) 16407e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, raw, canonical) < 0) 16417e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1642c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1643c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical) 1644c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(canonical); 16457e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, raw, range) < 0) 16467e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1647c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1648c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug("untrans_context unable to compute raw context %s\n", range); 1649c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1650c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1651c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1652c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (lrange && urange) { 1653c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lraw = find_in_hashtable(lrange, domain, domain->trans_to_raw); 1654c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! lraw) { 1655c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lraw = compute_raw_from_trans(lrange, domain); 1656c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (lraw) { 1657c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *canonical = find_in_hashtable(lraw, domain, domain->raw_to_trans); 1658c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!canonical) { 1659c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth canonical = compute_trans_from_raw(lraw, domain); 1660c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical) 16617e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, lraw, canonical) < 0) 16627e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1663c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1664c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical) 1665c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(canonical); 16667e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, lraw, lrange) < 0) 16677e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1668c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1669c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth lraw = strdup(lrange); 1670c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! lraw) { 1671c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("strdup failed %s", strerror(errno)); 16727e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1673c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1674c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1675c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1676c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1677c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth uraw = find_in_hashtable(urange, domain, domain->trans_to_raw); 1678c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! uraw) { 1679c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth uraw = compute_raw_from_trans(urange, domain); 1680c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (uraw) { 1681c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth char *canonical = find_in_hashtable(uraw, domain, domain->raw_to_trans); 1682c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (!canonical) { 1683c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth canonical = compute_trans_from_raw(uraw, domain); 1684c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical) 16857e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, uraw, canonical) < 0) 16867e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 16877e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence } 1688c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (canonical) 1689c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(canonical); 16907e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence if (add_cache(domain, uraw, urange) < 0) 16917e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1692c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1693c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth uraw = strdup(urange); 1694c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (! uraw) { 1695c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("strdup failed %s", strerror(errno)); 16967e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1697c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1698c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1699c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1700c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1701c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1702c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (strcmp(lraw, uraw) == 0) { 1703c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&raw, "%s", lraw) < 0) { 1704c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 17057e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1706c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1707c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1708c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (asprintf(&raw, "%s-%s", lraw, uraw) < 0) { 1709c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_error("asprintf failed %s", strerror(errno)); 17107e0f0124743d241354afa888f3bfe23355679bc9Steve Lawrence return -1; 1711c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1712c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1713c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(lraw); 1714c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(uraw); 1715c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = '-'; 1716c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth break; 1717c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1718c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (dashp) 1719c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *dashp = '-'; 1720c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1721c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1722c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (raw) { 1723c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = new_context_str(incon, raw); 1724c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(raw); 1725c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } else { 1726c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth *rcon = new_context_str(incon, range); 1727c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1728c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth free(range); 1729c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1730c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#ifdef DEBUG 1731c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth struct timeval stopTime; 1732c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth gettimeofday(&stopTime, 0); 1733c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth long int ms; 1734c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth if (startTime.tv_usec > stopTime.tv_usec) 1735c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec - 1) * 1000 + (stopTime.tv_usec/1000 + 1000 - startTime.tv_usec/1000); 1736c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth else 1737c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth ms = (stopTime.tv_sec - startTime.tv_sec ) * 1000 + (stopTime.tv_usec/1000 - startTime.tv_usec/1000); 1738c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1739c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth log_debug(" untrans_context input='%s' output='%s' n %ld ms\n", incon, *rcon, ms); 1740c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth#endif 1741c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth return 0; 1742c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1743c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1744c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothvoid 1745c89625db93f63f29a57451e692ae33ab24d49291Xavier Tothfinish_context_translations(void) { 1746c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(domains) { 1747c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domain_t *next = domains->next; 1748c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_domain(domains); 1749c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth domains = next; 1750c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1751c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(sens_constraints) { 1752c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sens_constraint_t *next = sens_constraints->next; 1753c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_sens_constraint(&sens_constraints, sens_constraints); 1754c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth sens_constraints = next; 1755c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1756c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth while(cat_constraints) { 1757c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth cat_constraint_t *next = cat_constraints->next; 1758c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth destroy_cat_constraint(&cat_constraints, cat_constraints); 1759c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth cat_constraints = next; 1760c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth } 1761c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth} 1762c89625db93f63f29a57451e692ae33ab24d49291Xavier Toth 1763