xref: /freebsd/sbin/veriexec/manifest_lexer.l (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1*eb12b8eaSSimon J. Gerraty %{
2*eb12b8eaSSimon J. Gerraty /*-
3*eb12b8eaSSimon J. Gerraty  * Copyright (c) 2004-2018, Juniper Networks, Inc.
4*eb12b8eaSSimon J. Gerraty  *
5*eb12b8eaSSimon J. Gerraty  * Redistribution and use in source and binary forms, with or without
6*eb12b8eaSSimon J. Gerraty  * modification, are permitted provided that the following conditions
7*eb12b8eaSSimon J. Gerraty  * are met:
8*eb12b8eaSSimon J. Gerraty  * 1. Redistributions of source code must retain the above copyright
9*eb12b8eaSSimon J. Gerraty  *    notice, this list of conditions and the following disclaimer.
10*eb12b8eaSSimon J. Gerraty  * 2. Redistributions in binary form must reproduce the above copyright
11*eb12b8eaSSimon J. Gerraty  *    notice, this list of conditions and the following disclaimer in the
12*eb12b8eaSSimon J. Gerraty  *    documentation and/or other materials provided with the distribution.
13*eb12b8eaSSimon J. Gerraty  *
14*eb12b8eaSSimon J. Gerraty  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15*eb12b8eaSSimon J. Gerraty  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16*eb12b8eaSSimon J. Gerraty  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17*eb12b8eaSSimon J. Gerraty  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18*eb12b8eaSSimon J. Gerraty  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19*eb12b8eaSSimon J. Gerraty  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20*eb12b8eaSSimon J. Gerraty  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*eb12b8eaSSimon J. Gerraty  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*eb12b8eaSSimon J. Gerraty  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*eb12b8eaSSimon J. Gerraty  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24*eb12b8eaSSimon J. Gerraty  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*eb12b8eaSSimon J. Gerraty  */
26*eb12b8eaSSimon J. Gerraty 
27*eb12b8eaSSimon J. Gerraty #include <stdio.h>
28*eb12b8eaSSimon J. Gerraty #include <string.h>
29*eb12b8eaSSimon J. Gerraty #include "veriexec.h"
30*eb12b8eaSSimon J. Gerraty #include "manifest_parser.h"
31*eb12b8eaSSimon J. Gerraty 
32*eb12b8eaSSimon J. Gerraty #define YY_NO_UNPUT
33*eb12b8eaSSimon J. Gerraty 
34*eb12b8eaSSimon J. Gerraty int lineno = 1;
35*eb12b8eaSSimon J. Gerraty int bol = 1;
36*eb12b8eaSSimon J. Gerraty extern int parser_version;
37*eb12b8eaSSimon J. Gerraty 
38*eb12b8eaSSimon J. Gerraty void yyerror(const char *message);
39*eb12b8eaSSimon J. Gerraty void warning(const char *message);
40*eb12b8eaSSimon J. Gerraty int yylex(void);
41*eb12b8eaSSimon J. Gerraty 
42*eb12b8eaSSimon J. Gerraty %}
43*eb12b8eaSSimon J. Gerraty 
44*eb12b8eaSSimon J. Gerraty %%
45*eb12b8eaSSimon J. Gerraty 
46*eb12b8eaSSimon J. Gerraty \n {
47*eb12b8eaSSimon J. Gerraty 	lineno++;
48*eb12b8eaSSimon J. Gerraty 	bol=1;
49*eb12b8eaSSimon J. Gerraty 	return EOL;
50*eb12b8eaSSimon J. Gerraty }
51*eb12b8eaSSimon J. Gerraty 
52*eb12b8eaSSimon J. Gerraty [/a-zA-Z0-9\.][^ \t\n=]*  {
53*eb12b8eaSSimon J. Gerraty 	yylval.string = strdup(yytext);
54*eb12b8eaSSimon J. Gerraty 	if (bol) {
55*eb12b8eaSSimon J. Gerraty 		bol=0;
56*eb12b8eaSSimon J. Gerraty 		return PATH;
57*eb12b8eaSSimon J. Gerraty 	} else
58*eb12b8eaSSimon J. Gerraty 		return STRING;
59*eb12b8eaSSimon J. Gerraty }
60*eb12b8eaSSimon J. Gerraty 
61*eb12b8eaSSimon J. Gerraty = {
62*eb12b8eaSSimon J. Gerraty 	return EQ;
63*eb12b8eaSSimon J. Gerraty }
64*eb12b8eaSSimon J. Gerraty 
65*eb12b8eaSSimon J. Gerraty 
66*eb12b8eaSSimon J. Gerraty [ \t\r] ;  /* eat white ones */
67*eb12b8eaSSimon J. Gerraty 
68*eb12b8eaSSimon J. Gerraty #>[0-9]+ {
69*eb12b8eaSSimon J. Gerraty         /*
70*eb12b8eaSSimon J. Gerraty          * If we are older than the specified version
71*eb12b8eaSSimon J. Gerraty          * ignore rest of line, otherwise just discard this token.
72*eb12b8eaSSimon J. Gerraty          */
73*eb12b8eaSSimon J. Gerraty         int skip = atoi(&yytext[2]);
74*eb12b8eaSSimon J. Gerraty 
75*eb12b8eaSSimon J. Gerraty         VERBOSE(3, ("%s: skip if %d <= %d\n", yytext, parser_version, skip));
76*eb12b8eaSSimon J. Gerraty         if (parser_version <= skip) {
77*eb12b8eaSSimon J. Gerraty 		/* treat as a comment, yyless() is cheaper than yyunput() */
78*eb12b8eaSSimon J. Gerraty 		yytext[yyleng - 1] = '#';
79*eb12b8eaSSimon J. Gerraty 		yyless(2);
80*eb12b8eaSSimon J. Gerraty         }
81*eb12b8eaSSimon J. Gerraty }
82*eb12b8eaSSimon J. Gerraty 
83*eb12b8eaSSimon J. Gerraty #[^>\n].* ;      /* comment */
84*eb12b8eaSSimon J. Gerraty 
85*eb12b8eaSSimon J. Gerraty .    yyerror("invalid character");
86*eb12b8eaSSimon J. Gerraty 
87*eb12b8eaSSimon J. Gerraty %%
88*eb12b8eaSSimon J. Gerraty 
89*eb12b8eaSSimon J. Gerraty static char *manifest_file = NULL;
90*eb12b8eaSSimon J. Gerraty 
91*eb12b8eaSSimon J. Gerraty struct string_buf {
92*eb12b8eaSSimon J. Gerraty 	const char *buf;
93*eb12b8eaSSimon J. Gerraty 	size_t pos, size;
94*eb12b8eaSSimon J. Gerraty };
95*eb12b8eaSSimon J. Gerraty 
96*eb12b8eaSSimon J. Gerraty static int
97*eb12b8eaSSimon J. Gerraty read_string_buf (void *token, char *dest, int count)
98*eb12b8eaSSimon J. Gerraty {
99*eb12b8eaSSimon J. Gerraty 	struct string_buf *str_buf_p = (struct string_buf *)token;
100*eb12b8eaSSimon J. Gerraty 	ssize_t n;
101*eb12b8eaSSimon J. Gerraty 
102*eb12b8eaSSimon J. Gerraty 	if (count < 0)
103*eb12b8eaSSimon J. Gerraty 		return 0;
104*eb12b8eaSSimon J. Gerraty 
105*eb12b8eaSSimon J. Gerraty 	n = str_buf_p->size - str_buf_p->pos;
106*eb12b8eaSSimon J. Gerraty 	if (count < n)
107*eb12b8eaSSimon J. Gerraty 		n = count;
108*eb12b8eaSSimon J. Gerraty 
109*eb12b8eaSSimon J. Gerraty 	memcpy(dest, str_buf_p->buf + str_buf_p->pos, n);
110*eb12b8eaSSimon J. Gerraty 	str_buf_p->pos += n;
111*eb12b8eaSSimon J. Gerraty 
112*eb12b8eaSSimon J. Gerraty 	return n;
113*eb12b8eaSSimon J. Gerraty }
114*eb12b8eaSSimon J. Gerraty 
115*eb12b8eaSSimon J. Gerraty FILE *
116*eb12b8eaSSimon J. Gerraty manifest_open (const char *file, const char *file_content)
117*eb12b8eaSSimon J. Gerraty {
118*eb12b8eaSSimon J. Gerraty 	static struct string_buf str_buf;
119*eb12b8eaSSimon J. Gerraty 
120*eb12b8eaSSimon J. Gerraty 	if (manifest_file) {
121*eb12b8eaSSimon J. Gerraty 		free(manifest_file);
122*eb12b8eaSSimon J. Gerraty 		fclose(yyin);
123*eb12b8eaSSimon J. Gerraty 	}
124*eb12b8eaSSimon J. Gerraty 
125*eb12b8eaSSimon J. Gerraty 	str_buf.buf  = file_content;
126*eb12b8eaSSimon J. Gerraty 	str_buf.pos  = 0;
127*eb12b8eaSSimon J. Gerraty 	str_buf.size = strlen(file_content);
128*eb12b8eaSSimon J. Gerraty 	yyin = fropen(&str_buf, read_string_buf);
129*eb12b8eaSSimon J. Gerraty 	if (yyin) {
130*eb12b8eaSSimon J. Gerraty 		manifest_file = strdup(file);
131*eb12b8eaSSimon J. Gerraty 		lineno = 1;
132*eb12b8eaSSimon J. Gerraty 		manifest_parser_init();
133*eb12b8eaSSimon J. Gerraty 	} else
134*eb12b8eaSSimon J. Gerraty 		manifest_file = NULL;
135*eb12b8eaSSimon J. Gerraty 	return yyin;
136*eb12b8eaSSimon J. Gerraty }
137*eb12b8eaSSimon J. Gerraty 
138*eb12b8eaSSimon J. Gerraty void
139*eb12b8eaSSimon J. Gerraty yyerror(const char *string)
140*eb12b8eaSSimon J. Gerraty {
141*eb12b8eaSSimon J. Gerraty 	fprintf(stderr, "%s: %d: %s at %s\n",
142*eb12b8eaSSimon J. Gerraty 	    manifest_file, lineno, string, yytext);
143*eb12b8eaSSimon J. Gerraty }
144*eb12b8eaSSimon J. Gerraty 
145*eb12b8eaSSimon J. Gerraty int
146*eb12b8eaSSimon J. Gerraty yywrap(void)
147*eb12b8eaSSimon J. Gerraty {
148*eb12b8eaSSimon J. Gerraty 	return (1);
149*eb12b8eaSSimon J. Gerraty }
150