Coverage Report

Created: 2024-10-16 06:45

/src/selinux/checkpolicy/parse_util.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Author: Karl MacMillan <kmacmillan@tresys.com>
3
 *
4
 * Copyright (C) 2006 Tresys Technology, LLC
5
 *
6
 *  This library is free software; you can redistribute it and/or
7
 *  modify it under the terms of the GNU Lesser General Public
8
 *  License as published by the Free Software Foundation; either
9
 *  version 2.1 of the License, or (at your option) any later version.
10
 *
11
 *  This library is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 *  Lesser General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU Lesser General Public
17
 *  License along with this library; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
21
#include "parse_util.h"
22
#include "queue.h"
23
24
/* these are defined in policy_parse.y and are needed for read_source_policy */
25
extern FILE *yyin;
26
extern void init_parser(int);
27
extern int yyparse(void);
28
extern void yyrestart(FILE *);
29
extern int yylex_destroy(void);
30
extern queue_t id_queue;
31
extern unsigned int policydb_errors;
32
extern policydb_t *policydbp;
33
extern int mlspol;
34
extern void set_source_file(const char *name);
35
36
int read_source_policy(policydb_t * p, const char *file, const char *progname)
37
0
{
38
0
  int rc = -1;
39
40
0
  yyin = fopen(file, "r");
41
0
  if (!yyin) {
42
0
    fprintf(stderr, "%s:  unable to open %s:  %s\n", progname, file, strerror(errno));
43
0
    return -1;
44
0
  }
45
0
  set_source_file(file);
46
47
0
  id_queue = queue_create();
48
0
  if (id_queue == NULL) {
49
0
    fprintf(stderr, "%s: out of memory!\n", progname);
50
0
    goto cleanup;
51
0
  }
52
53
0
  mlspol = p->mls;
54
0
  policydbp = p;
55
0
  policydbp->name = strdup(file);
56
0
  if (!policydbp->name) {
57
0
    fprintf(stderr, "%s: out of memory!\n", progname);
58
0
    goto cleanup;
59
0
  }
60
61
0
  init_parser(1);
62
0
  if (yyparse() || policydb_errors) {
63
0
    fprintf(stderr,
64
0
      "%s:  error(s) encountered while parsing configuration\n",
65
0
      progname);
66
0
    goto cleanup;
67
0
  }
68
0
  rewind(yyin);
69
0
  init_parser(2);
70
0
  set_source_file(file);
71
0
  yyrestart(yyin);
72
0
  if (yyparse() || policydb_errors) {
73
0
    fprintf(stderr,
74
0
      "%s:  error(s) encountered while parsing configuration\n",
75
0
      progname);
76
0
    goto cleanup;
77
0
  }
78
79
0
  rc = 0;
80
81
0
cleanup:
82
0
  queue_destroy(id_queue);
83
0
  fclose(yyin);
84
0
  yylex_destroy();
85
86
0
  return rc;
87
0
}