1*2d543d20SAndroid Build Coastguard Worker
2*2d543d20SAndroid Build Coastguard Worker /*
3*2d543d20SAndroid Build Coastguard Worker * Author : Stephen Smalley, <[email protected]>
4*2d543d20SAndroid Build Coastguard Worker */
5*2d543d20SAndroid Build Coastguard Worker
6*2d543d20SAndroid Build Coastguard Worker /* Updated: David Caplan, <[email protected]>
7*2d543d20SAndroid Build Coastguard Worker *
8*2d543d20SAndroid Build Coastguard Worker * Added conditional policy language extensions
9*2d543d20SAndroid Build Coastguard Worker *
10*2d543d20SAndroid Build Coastguard Worker * Jason Tang <[email protected]>
11*2d543d20SAndroid Build Coastguard Worker *
12*2d543d20SAndroid Build Coastguard Worker * Added support for binary policy modules
13*2d543d20SAndroid Build Coastguard Worker *
14*2d543d20SAndroid Build Coastguard Worker * Copyright (C) 2003-5 Tresys Technology, LLC
15*2d543d20SAndroid Build Coastguard Worker * Copyright (C) 2017 Mellanox Technologies Inc.
16*2d543d20SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
17*2d543d20SAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
18*2d543d20SAndroid Build Coastguard Worker * the Free Software Foundation, version 2.
19*2d543d20SAndroid Build Coastguard Worker */
20*2d543d20SAndroid Build Coastguard Worker
21*2d543d20SAndroid Build Coastguard Worker /* FLASK */
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker %{
24*2d543d20SAndroid Build Coastguard Worker #include <sys/types.h>
25*2d543d20SAndroid Build Coastguard Worker #include <ctype.h>
26*2d543d20SAndroid Build Coastguard Worker #include <limits.h>
27*2d543d20SAndroid Build Coastguard Worker #include <stdint.h>
28*2d543d20SAndroid Build Coastguard Worker #include <string.h>
29*2d543d20SAndroid Build Coastguard Worker
30*2d543d20SAndroid Build Coastguard Worker typedef int (* require_func_t)(void);
31*2d543d20SAndroid Build Coastguard Worker
32*2d543d20SAndroid Build Coastguard Worker #ifdef ANDROID
33*2d543d20SAndroid Build Coastguard Worker #include "policy_parse.h"
34*2d543d20SAndroid Build Coastguard Worker #else
35*2d543d20SAndroid Build Coastguard Worker #include "y.tab.h"
36*2d543d20SAndroid Build Coastguard Worker #endif
37*2d543d20SAndroid Build Coastguard Worker
38*2d543d20SAndroid Build Coastguard Worker static char linebuf[2][255];
39*2d543d20SAndroid Build Coastguard Worker static unsigned int lno = 0;
40*2d543d20SAndroid Build Coastguard Worker int werror = 0;
41*2d543d20SAndroid Build Coastguard Worker int yyerror(const char *msg);
42*2d543d20SAndroid Build Coastguard Worker int yywarn(const char *msg);
43*2d543d20SAndroid Build Coastguard Worker
44*2d543d20SAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
45*2d543d20SAndroid Build Coastguard Worker /*
46*2d543d20SAndroid Build Coastguard Worker * Version that does not exit, like yy_fatal_error(),
47*2d543d20SAndroid Build Coastguard Worker * since fuzz targets must not call exit().
48*2d543d20SAndroid Build Coastguard Worker */
49*2d543d20SAndroid Build Coastguard Worker #include <setjmp.h>
50*2d543d20SAndroid Build Coastguard Worker extern jmp_buf fuzzing_pre_parse_stack_state;
yyfatal(const char * msg)51*2d543d20SAndroid Build Coastguard Worker void yyfatal(const char *msg)
52*2d543d20SAndroid Build Coastguard Worker {
53*2d543d20SAndroid Build Coastguard Worker yyerror(msg);
54*2d543d20SAndroid Build Coastguard Worker longjmp(fuzzing_pre_parse_stack_state, 1);
55*2d543d20SAndroid Build Coastguard Worker }
56*2d543d20SAndroid Build Coastguard Worker #define YY_FATAL_ERROR(msg) yyfatal(msg)
57*2d543d20SAndroid Build Coastguard Worker #endif
58*2d543d20SAndroid Build Coastguard Worker
59*2d543d20SAndroid Build Coastguard Worker void set_source_file(const char *name);
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker char source_file[PATH_MAX];
62*2d543d20SAndroid Build Coastguard Worker unsigned long source_lineno = 1;
63*2d543d20SAndroid Build Coastguard Worker
64*2d543d20SAndroid Build Coastguard Worker unsigned long policydb_lineno = 1;
65*2d543d20SAndroid Build Coastguard Worker
66*2d543d20SAndroid Build Coastguard Worker unsigned int policydb_errors = 0;
67*2d543d20SAndroid Build Coastguard Worker %}
68*2d543d20SAndroid Build Coastguard Worker
69*2d543d20SAndroid Build Coastguard Worker %option noinput nounput noyywrap
70*2d543d20SAndroid Build Coastguard Worker
71*2d543d20SAndroid Build Coastguard Worker %array
72*2d543d20SAndroid Build Coastguard Worker letter [A-Za-z]
73*2d543d20SAndroid Build Coastguard Worker digit [0-9]
74*2d543d20SAndroid Build Coastguard Worker alnum [a-zA-Z0-9]
75*2d543d20SAndroid Build Coastguard Worker hexval [0-9A-Fa-f]
76*2d543d20SAndroid Build Coastguard Worker
77*2d543d20SAndroid Build Coastguard Worker %%
78*2d543d20SAndroid Build Coastguard Worker \n.* {
79*2d543d20SAndroid Build Coastguard Worker #if defined(__GNUC__) && __GNUC__ >= 8
80*2d543d20SAndroid Build Coastguard Worker #pragma GCC diagnostic push
81*2d543d20SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wstringop-truncation"
82*2d543d20SAndroid Build Coastguard Worker #endif
83*2d543d20SAndroid Build Coastguard Worker strncpy(linebuf[lno], yytext+1, 255);
84*2d543d20SAndroid Build Coastguard Worker #if defined(__GNUC__) && __GNUC__ >= 8
85*2d543d20SAndroid Build Coastguard Worker #pragma GCC diagnostic pop
86*2d543d20SAndroid Build Coastguard Worker #endif
87*2d543d20SAndroid Build Coastguard Worker linebuf[lno][254] = 0;
88*2d543d20SAndroid Build Coastguard Worker lno = 1 - lno;
89*2d543d20SAndroid Build Coastguard Worker policydb_lineno++;
90*2d543d20SAndroid Build Coastguard Worker if (source_lineno == ULONG_MAX)
91*2d543d20SAndroid Build Coastguard Worker yywarn("source line number overflow");
92*2d543d20SAndroid Build Coastguard Worker else
93*2d543d20SAndroid Build Coastguard Worker source_lineno++;
94*2d543d20SAndroid Build Coastguard Worker yyless(1);
95*2d543d20SAndroid Build Coastguard Worker }
96*2d543d20SAndroid Build Coastguard Worker COMMON |
97*2d543d20SAndroid Build Coastguard Worker common { return(COMMON); }
98*2d543d20SAndroid Build Coastguard Worker CLASS |
99*2d543d20SAndroid Build Coastguard Worker class { return(CLASS); }
100*2d543d20SAndroid Build Coastguard Worker CONSTRAIN |
101*2d543d20SAndroid Build Coastguard Worker constrain { return(CONSTRAIN); }
102*2d543d20SAndroid Build Coastguard Worker VALIDATETRANS |
103*2d543d20SAndroid Build Coastguard Worker validatetrans { return(VALIDATETRANS); }
104*2d543d20SAndroid Build Coastguard Worker INHERITS |
105*2d543d20SAndroid Build Coastguard Worker inherits { return(INHERITS); }
106*2d543d20SAndroid Build Coastguard Worker SID |
107*2d543d20SAndroid Build Coastguard Worker sid { return(SID); }
108*2d543d20SAndroid Build Coastguard Worker ROLE |
109*2d543d20SAndroid Build Coastguard Worker role { return(ROLE); }
110*2d543d20SAndroid Build Coastguard Worker ROLES |
111*2d543d20SAndroid Build Coastguard Worker roles { return(ROLES); }
112*2d543d20SAndroid Build Coastguard Worker ROLEATTRIBUTE |
113*2d543d20SAndroid Build Coastguard Worker roleattribute { return(ROLEATTRIBUTE);}
114*2d543d20SAndroid Build Coastguard Worker ATTRIBUTE_ROLE |
115*2d543d20SAndroid Build Coastguard Worker attribute_role { return(ATTRIBUTE_ROLE);}
116*2d543d20SAndroid Build Coastguard Worker TYPES |
117*2d543d20SAndroid Build Coastguard Worker types { return(TYPES); }
118*2d543d20SAndroid Build Coastguard Worker TYPEALIAS |
119*2d543d20SAndroid Build Coastguard Worker typealias { return(TYPEALIAS); }
120*2d543d20SAndroid Build Coastguard Worker TYPEATTRIBUTE |
121*2d543d20SAndroid Build Coastguard Worker typeattribute { return(TYPEATTRIBUTE); }
122*2d543d20SAndroid Build Coastguard Worker TYPEBOUNDS |
123*2d543d20SAndroid Build Coastguard Worker typebounds { return(TYPEBOUNDS); }
124*2d543d20SAndroid Build Coastguard Worker TYPE |
125*2d543d20SAndroid Build Coastguard Worker type { return(TYPE); }
126*2d543d20SAndroid Build Coastguard Worker BOOL |
127*2d543d20SAndroid Build Coastguard Worker bool { return(BOOL); }
128*2d543d20SAndroid Build Coastguard Worker TUNABLE |
129*2d543d20SAndroid Build Coastguard Worker tunable { return(TUNABLE); }
130*2d543d20SAndroid Build Coastguard Worker IF |
131*2d543d20SAndroid Build Coastguard Worker if { return(IF); }
132*2d543d20SAndroid Build Coastguard Worker ELSE |
133*2d543d20SAndroid Build Coastguard Worker else { return(ELSE); }
134*2d543d20SAndroid Build Coastguard Worker ALIAS |
135*2d543d20SAndroid Build Coastguard Worker alias { return(ALIAS); }
136*2d543d20SAndroid Build Coastguard Worker ATTRIBUTE |
137*2d543d20SAndroid Build Coastguard Worker attribute { return(ATTRIBUTE); }
138*2d543d20SAndroid Build Coastguard Worker EXPANDATTRIBUTE |
139*2d543d20SAndroid Build Coastguard Worker expandattribute { return(EXPANDATTRIBUTE); }
140*2d543d20SAndroid Build Coastguard Worker TYPE_TRANSITION |
141*2d543d20SAndroid Build Coastguard Worker type_transition { return(TYPE_TRANSITION); }
142*2d543d20SAndroid Build Coastguard Worker TYPE_MEMBER |
143*2d543d20SAndroid Build Coastguard Worker type_member { return(TYPE_MEMBER); }
144*2d543d20SAndroid Build Coastguard Worker TYPE_CHANGE |
145*2d543d20SAndroid Build Coastguard Worker type_change { return(TYPE_CHANGE); }
146*2d543d20SAndroid Build Coastguard Worker ROLE_TRANSITION |
147*2d543d20SAndroid Build Coastguard Worker role_transition { return(ROLE_TRANSITION); }
148*2d543d20SAndroid Build Coastguard Worker RANGE_TRANSITION |
149*2d543d20SAndroid Build Coastguard Worker range_transition { return(RANGE_TRANSITION); }
150*2d543d20SAndroid Build Coastguard Worker SENSITIVITY |
151*2d543d20SAndroid Build Coastguard Worker sensitivity { return(SENSITIVITY); }
152*2d543d20SAndroid Build Coastguard Worker DOMINANCE |
153*2d543d20SAndroid Build Coastguard Worker dominance { return(DOMINANCE); }
154*2d543d20SAndroid Build Coastguard Worker CATEGORY |
155*2d543d20SAndroid Build Coastguard Worker category { return(CATEGORY); }
156*2d543d20SAndroid Build Coastguard Worker LEVEL |
157*2d543d20SAndroid Build Coastguard Worker level { return(LEVEL); }
158*2d543d20SAndroid Build Coastguard Worker RANGE |
159*2d543d20SAndroid Build Coastguard Worker range { return(RANGE); }
160*2d543d20SAndroid Build Coastguard Worker MLSCONSTRAIN |
161*2d543d20SAndroid Build Coastguard Worker mlsconstrain { return(MLSCONSTRAIN); }
162*2d543d20SAndroid Build Coastguard Worker MLSVALIDATETRANS |
163*2d543d20SAndroid Build Coastguard Worker mlsvalidatetrans { return(MLSVALIDATETRANS); }
164*2d543d20SAndroid Build Coastguard Worker USER |
165*2d543d20SAndroid Build Coastguard Worker user { return(USER); }
166*2d543d20SAndroid Build Coastguard Worker NEVERALLOW |
167*2d543d20SAndroid Build Coastguard Worker neverallow { return(NEVERALLOW); }
168*2d543d20SAndroid Build Coastguard Worker ALLOW |
169*2d543d20SAndroid Build Coastguard Worker allow { return(ALLOW); }
170*2d543d20SAndroid Build Coastguard Worker AUDITALLOW |
171*2d543d20SAndroid Build Coastguard Worker auditallow { return(AUDITALLOW); }
172*2d543d20SAndroid Build Coastguard Worker AUDITDENY |
173*2d543d20SAndroid Build Coastguard Worker auditdeny { return(AUDITDENY); }
174*2d543d20SAndroid Build Coastguard Worker DONTAUDIT |
175*2d543d20SAndroid Build Coastguard Worker dontaudit { return(DONTAUDIT); }
176*2d543d20SAndroid Build Coastguard Worker ALLOWXPERM |
177*2d543d20SAndroid Build Coastguard Worker allowxperm { return(ALLOWXPERM); }
178*2d543d20SAndroid Build Coastguard Worker AUDITALLOWXPERM |
179*2d543d20SAndroid Build Coastguard Worker auditallowxperm { return(AUDITALLOWXPERM); }
180*2d543d20SAndroid Build Coastguard Worker DONTAUDITXPERM |
181*2d543d20SAndroid Build Coastguard Worker dontauditxperm { return(DONTAUDITXPERM); }
182*2d543d20SAndroid Build Coastguard Worker NEVERALLOWXPERM |
183*2d543d20SAndroid Build Coastguard Worker neverallowxperm { return(NEVERALLOWXPERM); }
184*2d543d20SAndroid Build Coastguard Worker SOURCE |
185*2d543d20SAndroid Build Coastguard Worker source { return(SOURCE); }
186*2d543d20SAndroid Build Coastguard Worker TARGET |
187*2d543d20SAndroid Build Coastguard Worker target { return(TARGET); }
188*2d543d20SAndroid Build Coastguard Worker SAMEUSER |
189*2d543d20SAndroid Build Coastguard Worker sameuser { return(SAMEUSER);}
190*2d543d20SAndroid Build Coastguard Worker module|MODULE { return(MODULE); }
191*2d543d20SAndroid Build Coastguard Worker require|REQUIRE { return(REQUIRE); }
192*2d543d20SAndroid Build Coastguard Worker optional|OPTIONAL { return(OPTIONAL); }
193*2d543d20SAndroid Build Coastguard Worker OR |
194*2d543d20SAndroid Build Coastguard Worker or { return(OR);}
195*2d543d20SAndroid Build Coastguard Worker AND |
196*2d543d20SAndroid Build Coastguard Worker and { return(AND);}
197*2d543d20SAndroid Build Coastguard Worker NOT |
198*2d543d20SAndroid Build Coastguard Worker not { return(NOT);}
199*2d543d20SAndroid Build Coastguard Worker xor |
200*2d543d20SAndroid Build Coastguard Worker XOR { return(XOR); }
201*2d543d20SAndroid Build Coastguard Worker eq |
202*2d543d20SAndroid Build Coastguard Worker EQ { return(EQUALS);}
203*2d543d20SAndroid Build Coastguard Worker true |
204*2d543d20SAndroid Build Coastguard Worker TRUE { return(CTRUE); }
205*2d543d20SAndroid Build Coastguard Worker false |
206*2d543d20SAndroid Build Coastguard Worker FALSE { return(CFALSE); }
207*2d543d20SAndroid Build Coastguard Worker dom |
208*2d543d20SAndroid Build Coastguard Worker DOM { return(DOM);}
209*2d543d20SAndroid Build Coastguard Worker domby |
210*2d543d20SAndroid Build Coastguard Worker DOMBY { return(DOMBY);}
211*2d543d20SAndroid Build Coastguard Worker INCOMP |
212*2d543d20SAndroid Build Coastguard Worker incomp { return(INCOMP);}
213*2d543d20SAndroid Build Coastguard Worker fscon |
214*2d543d20SAndroid Build Coastguard Worker FSCON { return(FSCON);}
215*2d543d20SAndroid Build Coastguard Worker ibpkeycon |
216*2d543d20SAndroid Build Coastguard Worker IBPKEYCON { return(IBPKEYCON);}
217*2d543d20SAndroid Build Coastguard Worker ibendportcon |
218*2d543d20SAndroid Build Coastguard Worker IBENDPORTCON { return(IBENDPORTCON);}
219*2d543d20SAndroid Build Coastguard Worker portcon |
220*2d543d20SAndroid Build Coastguard Worker PORTCON { return(PORTCON);}
221*2d543d20SAndroid Build Coastguard Worker netifcon |
222*2d543d20SAndroid Build Coastguard Worker NETIFCON { return(NETIFCON);}
223*2d543d20SAndroid Build Coastguard Worker nodecon |
224*2d543d20SAndroid Build Coastguard Worker NODECON { return(NODECON);}
225*2d543d20SAndroid Build Coastguard Worker pirqcon |
226*2d543d20SAndroid Build Coastguard Worker PIRQCON { return(PIRQCON);}
227*2d543d20SAndroid Build Coastguard Worker iomemcon |
228*2d543d20SAndroid Build Coastguard Worker IOMEMCON { return(IOMEMCON);}
229*2d543d20SAndroid Build Coastguard Worker ioportcon |
230*2d543d20SAndroid Build Coastguard Worker IOPORTCON { return(IOPORTCON);}
231*2d543d20SAndroid Build Coastguard Worker pcidevicecon |
232*2d543d20SAndroid Build Coastguard Worker PCIDEVICECON { return(PCIDEVICECON);}
233*2d543d20SAndroid Build Coastguard Worker devicetreecon |
234*2d543d20SAndroid Build Coastguard Worker DEVICETREECON { return(DEVICETREECON);}
235*2d543d20SAndroid Build Coastguard Worker fs_use_xattr |
236*2d543d20SAndroid Build Coastguard Worker FS_USE_XATTR { return(FSUSEXATTR);}
237*2d543d20SAndroid Build Coastguard Worker fs_use_task |
238*2d543d20SAndroid Build Coastguard Worker FS_USE_TASK { return(FSUSETASK);}
239*2d543d20SAndroid Build Coastguard Worker fs_use_trans |
240*2d543d20SAndroid Build Coastguard Worker FS_USE_TRANS { return(FSUSETRANS);}
241*2d543d20SAndroid Build Coastguard Worker genfscon |
242*2d543d20SAndroid Build Coastguard Worker GENFSCON { return(GENFSCON);}
243*2d543d20SAndroid Build Coastguard Worker r1 |
244*2d543d20SAndroid Build Coastguard Worker R1 { return(R1); }
245*2d543d20SAndroid Build Coastguard Worker r2 |
246*2d543d20SAndroid Build Coastguard Worker R2 { return(R2); }
247*2d543d20SAndroid Build Coastguard Worker r3 |
248*2d543d20SAndroid Build Coastguard Worker R3 { return(R3); }
249*2d543d20SAndroid Build Coastguard Worker u1 |
250*2d543d20SAndroid Build Coastguard Worker U1 { return(U1); }
251*2d543d20SAndroid Build Coastguard Worker u2 |
252*2d543d20SAndroid Build Coastguard Worker U2 { return(U2); }
253*2d543d20SAndroid Build Coastguard Worker u3 |
254*2d543d20SAndroid Build Coastguard Worker U3 { return(U3); }
255*2d543d20SAndroid Build Coastguard Worker t1 |
256*2d543d20SAndroid Build Coastguard Worker T1 { return(T1); }
257*2d543d20SAndroid Build Coastguard Worker t2 |
258*2d543d20SAndroid Build Coastguard Worker T2 { return(T2); }
259*2d543d20SAndroid Build Coastguard Worker t3 |
260*2d543d20SAndroid Build Coastguard Worker T3 { return(T3); }
261*2d543d20SAndroid Build Coastguard Worker l1 |
262*2d543d20SAndroid Build Coastguard Worker L1 { return(L1); }
263*2d543d20SAndroid Build Coastguard Worker l2 |
264*2d543d20SAndroid Build Coastguard Worker L2 { return(L2); }
265*2d543d20SAndroid Build Coastguard Worker h1 |
266*2d543d20SAndroid Build Coastguard Worker H1 { return(H1); }
267*2d543d20SAndroid Build Coastguard Worker h2 |
268*2d543d20SAndroid Build Coastguard Worker H2 { return(H2); }
269*2d543d20SAndroid Build Coastguard Worker policycap |
270*2d543d20SAndroid Build Coastguard Worker POLICYCAP { return(POLICYCAP); }
271*2d543d20SAndroid Build Coastguard Worker permissive |
272*2d543d20SAndroid Build Coastguard Worker PERMISSIVE { return(PERMISSIVE); }
273*2d543d20SAndroid Build Coastguard Worker default_user |
274*2d543d20SAndroid Build Coastguard Worker DEFAULT_USER { return(DEFAULT_USER); }
275*2d543d20SAndroid Build Coastguard Worker default_role |
276*2d543d20SAndroid Build Coastguard Worker DEFAULT_ROLE { return(DEFAULT_ROLE); }
277*2d543d20SAndroid Build Coastguard Worker default_type |
278*2d543d20SAndroid Build Coastguard Worker DEFAULT_TYPE { return(DEFAULT_TYPE); }
279*2d543d20SAndroid Build Coastguard Worker default_range |
280*2d543d20SAndroid Build Coastguard Worker DEFAULT_RANGE { return(DEFAULT_RANGE); }
281*2d543d20SAndroid Build Coastguard Worker low-high |
282*2d543d20SAndroid Build Coastguard Worker LOW-HIGH { return(LOW_HIGH); }
283*2d543d20SAndroid Build Coastguard Worker high |
284*2d543d20SAndroid Build Coastguard Worker HIGH { return(HIGH); }
285*2d543d20SAndroid Build Coastguard Worker low |
286*2d543d20SAndroid Build Coastguard Worker LOW { return(LOW); }
287*2d543d20SAndroid Build Coastguard Worker glblub |
288*2d543d20SAndroid Build Coastguard Worker GLBLUB { return(GLBLUB); }
289*2d543d20SAndroid Build Coastguard Worker "/"[^ \n\r\t\f]* { return(PATH); }
290*2d543d20SAndroid Build Coastguard Worker \""/"[^\"\n]*\" { return(QPATH); }
291*2d543d20SAndroid Build Coastguard Worker \"[^"/"\"\n]+\" { return(FILENAME); }
292*2d543d20SAndroid Build Coastguard Worker {letter}({alnum}|[_\-])*([\.]?({alnum}|[_\-]))* { return(IDENTIFIER); }
293*2d543d20SAndroid Build Coastguard Worker {digit}+|0x{hexval}+ { return(NUMBER); }
294*2d543d20SAndroid Build Coastguard Worker {alnum}*{letter}{alnum}* { return(FILESYSTEM); }
295*2d543d20SAndroid Build Coastguard Worker {digit}{1,3}(\.{digit}{1,3}){3}"/"{digit}{1,2} { return(IPV4_CIDR); }
296*2d543d20SAndroid Build Coastguard Worker {digit}{1,3}(\.{digit}{1,3}){3} { return(IPV4_ADDR); }
297*2d543d20SAndroid Build Coastguard Worker {hexval}{0,4}":"{hexval}{0,4}":"({hexval}|[:.])* { return(IPV6_ADDR); }
298*2d543d20SAndroid Build Coastguard Worker {hexval}{0,4}":"{hexval}{0,4}":"({hexval}|[:.])*"/"{digit}{1,3} { return(IPV6_CIDR); }
299*2d543d20SAndroid Build Coastguard Worker {digit}+(\.({alnum}|[_.])*)? { return(VERSION_IDENTIFIER); }
300*2d543d20SAndroid Build Coastguard Worker #line[ ]1[ ]\"[^\n]*\" { set_source_file(yytext+9); }
301*2d543d20SAndroid Build Coastguard Worker #line[ ]{digit}+ {
302*2d543d20SAndroid Build Coastguard Worker errno = 0;
303*2d543d20SAndroid Build Coastguard Worker source_lineno = strtoul(yytext+6, NULL, 10) - 1;
304*2d543d20SAndroid Build Coastguard Worker if (errno) {
305*2d543d20SAndroid Build Coastguard Worker yywarn("source line number too big");
306*2d543d20SAndroid Build Coastguard Worker }
307*2d543d20SAndroid Build Coastguard Worker }
308*2d543d20SAndroid Build Coastguard Worker #[^\n]* { /* delete comments */ }
309*2d543d20SAndroid Build Coastguard Worker [ \t\f]+ { /* delete whitespace */ }
310*2d543d20SAndroid Build Coastguard Worker "==" { return(EQUALS); }
311*2d543d20SAndroid Build Coastguard Worker "!=" { return (NOTEQUAL); }
312*2d543d20SAndroid Build Coastguard Worker "&&" { return (AND); }
313*2d543d20SAndroid Build Coastguard Worker "||" { return (OR); }
314*2d543d20SAndroid Build Coastguard Worker "!" { return (NOT); }
315*2d543d20SAndroid Build Coastguard Worker "^" { return (XOR); }
316*2d543d20SAndroid Build Coastguard Worker "," |
317*2d543d20SAndroid Build Coastguard Worker ":" |
318*2d543d20SAndroid Build Coastguard Worker ";" |
319*2d543d20SAndroid Build Coastguard Worker "(" |
320*2d543d20SAndroid Build Coastguard Worker ")" |
321*2d543d20SAndroid Build Coastguard Worker "{" |
322*2d543d20SAndroid Build Coastguard Worker "}" |
323*2d543d20SAndroid Build Coastguard Worker "[" |
324*2d543d20SAndroid Build Coastguard Worker "-" |
325*2d543d20SAndroid Build Coastguard Worker "." |
326*2d543d20SAndroid Build Coastguard Worker "]" |
327*2d543d20SAndroid Build Coastguard Worker "~" |
328*2d543d20SAndroid Build Coastguard Worker "*" { return(yytext[0]); }
329*2d543d20SAndroid Build Coastguard Worker . { yyerror("unrecognized character");
330*2d543d20SAndroid Build Coastguard Worker /* Available since bison 3.6, avoids duplicate error message */
331*2d543d20SAndroid Build Coastguard Worker #ifdef YYerror
332*2d543d20SAndroid Build Coastguard Worker return YYerror;
333*2d543d20SAndroid Build Coastguard Worker #else
334*2d543d20SAndroid Build Coastguard Worker return INVALID_CHAR;
335*2d543d20SAndroid Build Coastguard Worker #endif
336*2d543d20SAndroid Build Coastguard Worker }
337*2d543d20SAndroid Build Coastguard Worker %%
338*2d543d20SAndroid Build Coastguard Worker int yyerror(const char *msg)
339*2d543d20SAndroid Build Coastguard Worker {
340*2d543d20SAndroid Build Coastguard Worker #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
341*2d543d20SAndroid Build Coastguard Worker const char *token;
342*2d543d20SAndroid Build Coastguard Worker char buf[8];
343*2d543d20SAndroid Build Coastguard Worker
344*2d543d20SAndroid Build Coastguard Worker if (isprint((unsigned char)yytext[0])) {
345*2d543d20SAndroid Build Coastguard Worker token = yytext;
346*2d543d20SAndroid Build Coastguard Worker } else {
347*2d543d20SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%#x", yytext[0]);
348*2d543d20SAndroid Build Coastguard Worker token = buf;
349*2d543d20SAndroid Build Coastguard Worker }
350*2d543d20SAndroid Build Coastguard Worker
351*2d543d20SAndroid Build Coastguard Worker if (source_file[0])
352*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "%s:%lu:",
353*2d543d20SAndroid Build Coastguard Worker source_file, source_lineno);
354*2d543d20SAndroid Build Coastguard Worker else
355*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "(unknown source)::");
356*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "ERROR '%s' at token '%s' on line %lu:\n%s\n%s\n",
357*2d543d20SAndroid Build Coastguard Worker msg,
358*2d543d20SAndroid Build Coastguard Worker token,
359*2d543d20SAndroid Build Coastguard Worker policydb_lineno,
360*2d543d20SAndroid Build Coastguard Worker linebuf[0], linebuf[1]);
361*2d543d20SAndroid Build Coastguard Worker #else
362*2d543d20SAndroid Build Coastguard Worker (void)msg;
363*2d543d20SAndroid Build Coastguard Worker #endif
364*2d543d20SAndroid Build Coastguard Worker
365*2d543d20SAndroid Build Coastguard Worker policydb_errors++;
366*2d543d20SAndroid Build Coastguard Worker return -1;
367*2d543d20SAndroid Build Coastguard Worker }
368*2d543d20SAndroid Build Coastguard Worker
369*2d543d20SAndroid Build Coastguard Worker int yywarn(const char *msg)
370*2d543d20SAndroid Build Coastguard Worker {
371*2d543d20SAndroid Build Coastguard Worker if (werror)
372*2d543d20SAndroid Build Coastguard Worker return yyerror(msg);
373*2d543d20SAndroid Build Coastguard Worker
374*2d543d20SAndroid Build Coastguard Worker #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
375*2d543d20SAndroid Build Coastguard Worker if (source_file[0])
376*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "%s:%lu:",
377*2d543d20SAndroid Build Coastguard Worker source_file, source_lineno);
378*2d543d20SAndroid Build Coastguard Worker else
379*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "(unknown source)::");
380*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "WARNING '%s' at token '%s' on line %lu:\n%s\n%s\n",
381*2d543d20SAndroid Build Coastguard Worker msg,
382*2d543d20SAndroid Build Coastguard Worker yytext,
383*2d543d20SAndroid Build Coastguard Worker policydb_lineno,
384*2d543d20SAndroid Build Coastguard Worker linebuf[0], linebuf[1]);
385*2d543d20SAndroid Build Coastguard Worker #endif
386*2d543d20SAndroid Build Coastguard Worker
387*2d543d20SAndroid Build Coastguard Worker return 0;
388*2d543d20SAndroid Build Coastguard Worker }
389*2d543d20SAndroid Build Coastguard Worker
390*2d543d20SAndroid Build Coastguard Worker void set_source_file(const char *name)
391*2d543d20SAndroid Build Coastguard Worker {
392*2d543d20SAndroid Build Coastguard Worker source_lineno = 1;
393*2d543d20SAndroid Build Coastguard Worker strncpy(source_file, name, sizeof(source_file)-1);
394*2d543d20SAndroid Build Coastguard Worker source_file[sizeof(source_file)-1] = '\0';
395*2d543d20SAndroid Build Coastguard Worker if (strlen(source_file) && source_file[strlen(source_file)-1] == '"')
396*2d543d20SAndroid Build Coastguard Worker source_file[strlen(source_file)-1] = '\0';
397*2d543d20SAndroid Build Coastguard Worker }
398