checkpolicy: cleanup resources on parse error
Close the input file and free all memory by the queue and lexer on a syntax or parse error. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
595c4163f0
commit
c2fc48be68
|
@ -26,6 +26,7 @@ extern FILE *yyin;
|
|||
extern void init_parser(int);
|
||||
extern int yyparse(void);
|
||||
extern void yyrestart(FILE *);
|
||||
extern int yylex_destroy(void);
|
||||
extern queue_t id_queue;
|
||||
extern unsigned int policydb_errors;
|
||||
extern policydb_t *policydbp;
|
||||
|
@ -34,6 +35,8 @@ extern void set_source_file(const char *name);
|
|||
|
||||
int read_source_policy(policydb_t * p, const char *file, const char *progname)
|
||||
{
|
||||
int rc = -1;
|
||||
|
||||
yyin = fopen(file, "r");
|
||||
if (!yyin) {
|
||||
fprintf(stderr, "%s: unable to open %s: %s\n", progname, file, strerror(errno));
|
||||
|
@ -41,21 +44,26 @@ int read_source_policy(policydb_t * p, const char *file, const char *progname)
|
|||
}
|
||||
set_source_file(file);
|
||||
|
||||
if ((id_queue = queue_create()) == NULL) {
|
||||
id_queue = queue_create();
|
||||
if (id_queue == NULL) {
|
||||
fprintf(stderr, "%s: out of memory!\n", progname);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
mlspol = p->mls;
|
||||
policydbp = p;
|
||||
policydbp->name = strdup(file);
|
||||
mlspol = p->mls;
|
||||
if (!policydbp->name) {
|
||||
fprintf(stderr, "%s: out of memory!\n", progname);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
init_parser(1);
|
||||
if (yyparse() || policydb_errors) {
|
||||
fprintf(stderr,
|
||||
"%s: error(s) encountered while parsing configuration\n",
|
||||
progname);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
rewind(yyin);
|
||||
init_parser(2);
|
||||
|
@ -65,11 +73,15 @@ int read_source_policy(policydb_t * p, const char *file, const char *progname)
|
|||
fprintf(stderr,
|
||||
"%s: error(s) encountered while parsing configuration\n",
|
||||
progname);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
|
||||
cleanup:
|
||||
queue_destroy(id_queue);
|
||||
|
||||
fclose(yyin);
|
||||
yylex_destroy();
|
||||
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue