=================================================================== RCS file: /cvs/cvs/blind/parse.y,v retrieving revision 1.7 retrieving revision 1.16 diff -u -p -r1.7 -r1.16 --- blind/parse.y 2022/03/22 01:51:36 1.7 +++ blind/parse.y 2022/04/10 20:03:38 1.16 @@ -16,28 +16,24 @@ %{ #include -#include -#include -#include -#include #include - +#include +#include + #include "blind.h" +#include "config.h" #include "log.h" -TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files); static struct file { - TAILQ_ENTRY(file) entry; - FILE *stream; - char *name; - size_t ungetpos; - size_t ungetsize; - u_char *ungetbuf; - int eof_reached; - int lineno; - int errors; -} *file, *top; + FILE *stream; + char *name; + size_t ungetpos; + size_t ungetsize; + u_char *ungetbuf; + int eof_reached; + int lineno; +} *f; int lookup(char *); int igetc(void); @@ -48,15 +44,16 @@ int kw_cmp(const void *, const void *); int yyparse(void); int yylex(void); int yyerror(const char *, ...) - __attribute__((__format__ (printf, 1, 2))) - __attribute__((__nonnull__ (1))); + __attribute__((__format__ (printf, 1, 2))) + __attribute__((__nonnull__ (1))); int config_load(struct blind *); struct file *config_push(const char *); -int config_pop(void); -int config_perm(int, const char *); +int config_close(void); +#define START_EXPAND 1 +#define DONE_EXPAND 2 +static int expanding; - TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead); struct sym { TAILQ_ENTRY(sym) entry; @@ -89,7 +86,7 @@ typedef struct { grammar : | grammar '\n' | grammar set '\n' - | grammar error '\n' { file->errors++; } + | grammar error '\n' { errors++; } ; set : SET EXPIRE NUMBER { @@ -116,12 +113,12 @@ yyerror(const char *fmt, ...) va_list ap; char *msg; - file->errors++; + errors++; va_start(ap, fmt); if (vasprintf(&msg, fmt, ap) == -1) log_fatal("yyerror vasprintf"); va_end(ap); - log_info("%s:%d: %s", file->name, yylval.lineno, msg); + log_info("%s:%d: %s", f->name, yylval.lineno, msg); free(msg); return (0); } @@ -154,11 +151,6 @@ lookup(char *s) return (STRING); } -#define START_EXPAND 1 -#define DONE_EXPAND 2 - -static int expanding; - char * symget(const char *nam) { @@ -179,10 +171,10 @@ igetc(void) int c; while (1) { - if (file->ungetpos > 0) - c = file->ungetbuf[--file->ungetpos]; + if (f->ungetpos > 0) + c = f->ungetbuf[--f->ungetpos]; else - c = getc(file->stream); + c = getc(f->stream); if (c == START_EXPAND) expanding = 1; @@ -203,7 +195,7 @@ lgetc(int quotec) if ((c = igetc()) == EOF) { yyerror("reached end of file while parsing " "quoted string"); - if (file == top || config_pop() == EOF) + if (config_close() == EOF) return (EOF); return (quotec); } @@ -216,8 +208,8 @@ lgetc(int quotec) c = next; break; } - yylval.lineno = file->lineno; - file->lineno++; + yylval.lineno = f->lineno; + f->lineno++; } if (c == EOF) { @@ -226,12 +218,12 @@ lgetc(int quotec) * count right if last line in included file is syntactically * invalid and has no newline. */ - if (file->eof_reached == 0) { - file->eof_reached = 1; + if (f->eof_reached == 0) { + f->eof_reached = 1; return ('\n'); } while (c == EOF) { - if (file == top || config_pop() == EOF) + if (config_close() == EOF) return (EOF); c = igetc(); } @@ -245,14 +237,14 @@ lungetc(int c) if (c == EOF) return; - if (file->ungetpos >= file->ungetsize) { - void *p = reallocarray(file->ungetbuf, file->ungetsize, 2); + if (f->ungetpos >= f->ungetsize) { + void *p = reallocarray(f->ungetbuf, f->ungetsize, 2); if (p == NULL) log_fatal("cannot reallocate memory"); - file->ungetbuf = p; - file->ungetsize *= 2; + f->ungetbuf = p; + f->ungetsize *= 2; } - file->ungetbuf[file->ungetpos++] = c; + f->ungetbuf[f->ungetpos++] = c; } int @@ -264,7 +256,7 @@ findeol(void) while (1) { c = lgetc(0); if (c == '\n') { - file->lineno++; + f->lineno++; break; } if (c == EOF) @@ -286,7 +278,7 @@ top: while ((c = lgetc(0)) == ' ' || c == '\t') ; /* nothing */ - yylval.lineno = file->lineno; + yylval.lineno = f->lineno; if (c == '#') while ((c = lgetc(0)) != '\n' && c != EOF) ; /* nothing */ @@ -330,7 +322,7 @@ top: if ((c = lgetc(quotec)) == EOF) return (0); if (c == '\n') { - file->lineno++; + f->lineno++; continue; } else if (c == '\\') { if ((next = lgetc(quotec)) == EOF) @@ -339,7 +331,7 @@ top: next == '\t') c = next; else if (next == '\n') { - file->lineno++; + f->lineno++; continue; } else lungetc(next); @@ -368,7 +360,7 @@ top: if (c == '-' || isdigit(c)) { do { *p++ = c; - if ((size_t)(p-buf) >= sizeof(buf)) { + if ((size_t)(p-buf) >= sizeof(buf)) { yyerror("string too long"); return (findeol()); } @@ -427,8 +419,8 @@ nodigits: return (token); } if (c == '\n') { - yylval.lineno = file->lineno; - file->lineno++; + yylval.lineno = f->lineno; + f->lineno++; } if (c == EOF) return (0); @@ -438,104 +430,57 @@ nodigits: int config_load(struct blind *temp) { - env = temp; - errors = 0; + env = temp; + errors = 0; - if ((file = config_push(env->bl_conf)) == NULL) { - // config_purge(PURGE_ALL); - return (-1); + if ((f = calloc(1, sizeof(struct file))) == NULL) { + log_debug("cannot allocate memory"); + return (-1); + } + if ((f->name = strdup(env->bl_conf)) == NULL) { + log_debug("cannot duplicate name"); + free(f); + return (-1); } - top = file; + if ((f->stream = fopen(f->name, "r")) == NULL) { + log_debug("cannot open config file"); + free(f->name); + free(f); + return (-1); + } + if (config_perm(fileno(f->stream), f->name)) { + fclose(f->stream); + free(f->name); + free(f); + return (-1); + } + f->lineno = 1; + f->ungetsize = 16; + f->ungetbuf = malloc(f->ungetsize); + if (f->ungetbuf == NULL) { + log_debug("cannot allocate buffer"); + fclose(f->stream); + free(f->name); + free(f); + return (-1); + } - yyparse(); + yyparse(); + // setup - errors = file->errors; - config_pop(); + if (errors) + return (-1); - // setup - - if (errors) { - // config_purge(PURGE_ALL); - return (-1); - } - - return (0); + return (0); } -struct file * -config_push(const char *name) -{ - struct file *nfile; - - if ((nfile = calloc(1, sizeof(struct file))) == NULL) { - log_debug("cannot allocate memory"); - return (NULL); - } - if ((nfile->name = strdup(name)) == NULL) { - log_debug("cannot duplicate name"); - free(nfile); - return (NULL); - } - if ((nfile->stream = fopen(nfile->name, "r")) == NULL) { - log_debug("cannot open config file"); - free(nfile->name); - free(nfile); - return (NULL); - } - if (config_perm(fileno(nfile->stream), nfile->name)) { - fclose(nfile->stream); - free(nfile->name); - free(nfile); - return (NULL); - } - nfile->lineno = TAILQ_EMPTY(&files) ? 1 : 0; - nfile->ungetsize = 16; - nfile->ungetbuf = malloc(nfile->ungetsize); - if (nfile->ungetbuf == NULL) { - log_debug("cannot allocate buffer"); - fclose(nfile->stream); - free(nfile->name); - free(nfile); - return (NULL); - } - TAILQ_INSERT_TAIL(&files, nfile, entry); - return (nfile); -} - int -config_pop(void) +config_close(void) { - struct file *prv; + fclose(f->stream); + free(f->name); + free(f->ungetbuf); + free(f); - if ((prv = TAILQ_PREV(file, files, entry)) != NULL) - prv->errors += file->errors; - - TAILQ_REMOVE(&files, file, entry); - fclose(file->stream); - free(file->name); - free(file->ungetbuf); - free(file); - file = prv; - - return (file ? 0 : EOF); -} - -int -config_perm(int fd, const char *name) -{ - struct stat st; - - if (fstat(fd, &st)) { - log_debug("cannot stat config file"); - return (-1); - } - if (st.st_uid != 0 && st.st_uid != getuid()) { - log_debug("not root or current user owned"); - return (-1); - } - if (st.st_mode & (S_IWGRP | S_IXGRP | S_IRWXO)) { - log_debug("insecure config file"); - return (-1); - } - return (0); + return (EOF); }