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