blob: a61e0db8dd9b738f6938fc36faeb7161f19d3c8f [file] [log] [blame]
Joshua Brindle13cd4c82008-08-19 15:30:36 -04001
2/*
3 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
4 */
5
6/* Updated: David Caplan, <dac@tresys.com>
7 *
8 * Added conditional policy language extensions
9 *
10 * Jason Tang <jtang@tresys.com>
11 *
12 * Added support for binary policy modules
13 *
14 * Copyright (C) 2003-5 Tresys Technology, LLC
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation, version 2.
18 */
19
20/* FLASK */
21
22%{
23#include <sys/types.h>
24#include <limits.h>
25#include <stdint.h>
26#include <string.h>
27
28typedef int (* require_func_t)();
29
30#include "y.tab.h"
31
32static char linebuf[2][255];
33static unsigned int lno = 0;
34int yywarn(char *msg);
35
36void set_source_file(const char *name);
37
38char source_file[PATH_MAX];
39unsigned long source_lineno = 1;
40
41unsigned long policydb_lineno = 1;
42
43unsigned int policydb_errors = 0;
44%}
45
46%option noinput nounput
47
48%array
49letter [A-Za-z]
50digit [0-9]
51alnum [a-zA-Z0-9]
52hexval [0-9A-Fa-f]
53
54%%
55\n.* { strncpy(linebuf[lno], yytext+1, 255);
56 linebuf[lno][254] = 0;
57 lno = 1 - lno;
58 policydb_lineno++;
59 source_lineno++;
60 yyless(1); }
61CLONE |
62clone { return(CLONE); }
63COMMON |
64common { return(COMMON); }
65CLASS |
66class { return(CLASS); }
67CONSTRAIN |
68constrain { return(CONSTRAIN); }
69VALIDATETRANS |
70validatetrans { return(VALIDATETRANS); }
71INHERITS |
72inherits { return(INHERITS); }
73SID |
74sid { return(SID); }
75ROLE |
76role { return(ROLE); }
77ROLES |
78roles { return(ROLES); }
Harry Ciao16675b72011-07-25 09:23:54 +080079ROLEATTRIBUTE |
80roleattribute { return(ROLEATTRIBUTE);}
81ATTRIBUTE_ROLE |
82attribute_role { return(ATTRIBUTE_ROLE);}
Joshua Brindle13cd4c82008-08-19 15:30:36 -040083TYPES |
84types { return(TYPES); }
85TYPEALIAS |
86typealias { return(TYPEALIAS); }
87TYPEATTRIBUTE |
88typeattribute { return(TYPEATTRIBUTE); }
Joshua Brindle45728402008-10-08 06:56:51 -040089TYPEBOUNDS |
90typebounds { return(TYPEBOUNDS); }
Joshua Brindle13cd4c82008-08-19 15:30:36 -040091TYPE |
92type { return(TYPE); }
93BOOL |
94bool { return(BOOL); }
Harry Ciao80f26c52011-09-01 11:29:41 +080095TUNABLE |
96tunable { return(TUNABLE); }
Joshua Brindle13cd4c82008-08-19 15:30:36 -040097IF |
98if { return(IF); }
99ELSE |
100else { return(ELSE); }
101ALIAS |
102alias { return(ALIAS); }
103ATTRIBUTE |
104attribute { return(ATTRIBUTE); }
105TYPE_TRANSITION |
106type_transition { return(TYPE_TRANSITION); }
107TYPE_MEMBER |
108type_member { return(TYPE_MEMBER); }
109TYPE_CHANGE |
110type_change { return(TYPE_CHANGE); }
111ROLE_TRANSITION |
112role_transition { return(ROLE_TRANSITION); }
113RANGE_TRANSITION |
114range_transition { return(RANGE_TRANSITION); }
115SENSITIVITY |
116sensitivity { return(SENSITIVITY); }
117DOMINANCE |
118dominance { return(DOMINANCE); }
119CATEGORY |
120category { return(CATEGORY); }
121LEVEL |
122level { return(LEVEL); }
123RANGE |
124range { return(RANGE); }
125MLSCONSTRAIN |
126mlsconstrain { return(MLSCONSTRAIN); }
127MLSVALIDATETRANS |
128mlsvalidatetrans { return(MLSVALIDATETRANS); }
129USER |
130user { return(USER); }
131NEVERALLOW |
132neverallow { return(NEVERALLOW); }
133ALLOW |
134allow { return(ALLOW); }
135AUDITALLOW |
136auditallow { return(AUDITALLOW); }
137AUDITDENY |
138auditdeny { return(AUDITDENY); }
139DONTAUDIT |
140dontaudit { return(DONTAUDIT); }
141SOURCE |
142source { return(SOURCE); }
143TARGET |
144target { return(TARGET); }
145SAMEUSER |
146sameuser { return(SAMEUSER);}
147module|MODULE { return(MODULE); }
148require|REQUIRE { return(REQUIRE); }
149optional|OPTIONAL { return(OPTIONAL); }
150OR |
151or { return(OR);}
152AND |
153and { return(AND);}
154NOT |
155not { return(NOT);}
156xor |
157XOR { return(XOR); }
158eq |
159EQ { return(EQUALS);}
160true |
161TRUE { return(CTRUE); }
162false |
163FALSE { return(CFALSE); }
164dom |
165DOM { return(DOM);}
166domby |
167DOMBY { return(DOMBY);}
168INCOMP |
169incomp { return(INCOMP);}
170fscon |
171FSCON { return(FSCON);}
172portcon |
173PORTCON { return(PORTCON);}
174netifcon |
175NETIFCON { return(NETIFCON);}
176nodecon |
177NODECON { return(NODECON);}
Paul Nuzzi79d10a82009-09-29 10:06:26 -0400178pirqcon |
179PIRQCON { return(PIRQCON);}
180iomemcon |
181IOMEMCON { return(IOMEMCON);}
182ioportcon |
183IOPORTCON { return(IOPORTCON);}
184pcidevicecon |
185PCIDEVICECON { return(PCIDEVICECON);}
Joshua Brindle13cd4c82008-08-19 15:30:36 -0400186fs_use_xattr |
187FS_USE_XATTR { return(FSUSEXATTR);}
188fs_use_task |
189FS_USE_TASK { return(FSUSETASK);}
190fs_use_trans |
191FS_USE_TRANS { return(FSUSETRANS);}
192genfscon |
193GENFSCON { return(GENFSCON);}
194r1 |
195R1 { return(R1); }
196r2 |
197R2 { return(R2); }
198r3 |
199R3 { return(R3); }
200u1 |
201U1 { return(U1); }
202u2 |
203U2 { return(U2); }
204u3 |
205U3 { return(U3); }
206t1 |
207T1 { return(T1); }
208t2 |
209T2 { return(T2); }
210t3 |
211T3 { return(T3); }
212l1 |
213L1 { return(L1); }
214l2 |
215L2 { return(L2); }
216h1 |
217H1 { return(H1); }
218h2 |
219H2 { return(H2); }
220policycap |
221POLICYCAP { return(POLICYCAP); }
222permissive |
223PERMISSIVE { return(PERMISSIVE); }
Stephen Smalleyd5286d72008-10-14 10:57:24 -0400224"/"({alnum}|[_\.\-/])* { return(PATH); }
225{letter}({alnum}|[_\-])*([\.]?({alnum}|[_\-]))* { return(IDENTIFIER); }
Paul Nuzzi79d10a82009-09-29 10:06:26 -0400226{digit}+|0x{hexval}+ { return(NUMBER); }
Joshua Brindle13cd4c82008-08-19 15:30:36 -0400227{digit}{1,3}(\.{digit}{1,3}){3} { return(IPV4_ADDR); }
228{hexval}{0,4}":"{hexval}{0,4}":"({hexval}|[:.])* { return(IPV6_ADDR); }
229{digit}+(\.({alnum}|[_.])*)? { return(VERSION_IDENTIFIER); }
Dan Walshd72a9ec2011-04-12 09:54:46 -0400230\"({alnum}|[_\.\-])+\" { return(FILENAME); }
231{alnum}* { return(FILENAME); }
232\.({alnum}|[_\.\-])* { return(FILENAME); }
233{letter}+([-_\.]|{alnum})+ { return(FILENAME); }
234([_\.]){alnum}+ { return(FILENAME); }
Joshua Brindle13cd4c82008-08-19 15:30:36 -0400235#line[ ]1[ ]\"[^\n]*\" { set_source_file(yytext+9); }
236#line[ ]{digit}+ { source_lineno = atoi(yytext+6)-1; }
237#[^\n]* { /* delete comments */ }
238[ \t\f]+ { /* delete whitespace */ }
239"==" { return(EQUALS); }
240"!=" { return (NOTEQUAL); }
241"&&" { return (AND); }
242"||" { return (OR); }
243"!" { return (NOT); }
244"^" { return (XOR); }
245"," |
246":" |
247";" |
248"(" |
249")" |
250"{" |
251"}" |
252"[" |
253"-" |
254"." |
255"]" |
256"~" |
257"*" { return(yytext[0]); }
258. { yywarn("unrecognized character");}
259%%
260int yyerror(char *msg)
261{
262 if (source_file[0])
263 fprintf(stderr, "%s:%ld:",
264 source_file, source_lineno);
265 else
266 fprintf(stderr, "(unknown source)::");
267 fprintf(stderr, "ERROR '%s' at token '%s' on line %ld:\n%s\n%s\n",
268 msg,
269 yytext,
270 policydb_lineno,
271 linebuf[0], linebuf[1]);
272 policydb_errors++;
273 return -1;
274}
275
276int yywarn(char *msg)
277{
278 if (source_file[0])
279 fprintf(stderr, "%s:%ld:",
280 source_file, source_lineno);
281 else
282 fprintf(stderr, "(unknown source)::");
283 fprintf(stderr, "WARNING '%s' at token '%s' on line %ld:\n%s\n%s\n",
284 msg,
285 yytext,
286 policydb_lineno,
287 linebuf[0], linebuf[1]);
288 return 0;
289}
290
291void set_source_file(const char *name)
292{
293 source_lineno = 1;
294 strncpy(source_file, name, sizeof(source_file)-1);
295 source_file[sizeof(source_file)-1] = '\0';
296}