xref: /aosp_15_r20/external/selinux/checkpolicy/policy_scan.l (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
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