diff --exclude-from=exclude -N -u -r nsalibsepol/src/genbools.c libsepol-1.5.2/src/genbools.c --- nsalibsepol/src/genbools.c 2005-03-08 15:15:26.000000000 -0500 +++ libsepol-1.5.2/src/genbools.c 2005-03-29 10:20:54.000000000 -0500 @@ -24,11 +24,40 @@ return dest; } +static int process_boolean(char *buffer, char *name, int namesize, int *val) { + char name1[BUFSIZ]; + char *ptr; + char *tok=strtok_r(buffer,"=",&ptr); + if (tok) { + strncpy(name1,tok, BUFSIZ-1); + strtrim(name,name1,namesize-1); + if ( name[0]=='#' ) return 0; + tok=strtok_r(NULL,"\0",&ptr); + if (tok) { + while (isspace(*tok)) tok++; + *val = -1; + if (isdigit(tok[0])) + *val=atoi(tok); + else if (!strncmp(tok, "true", sizeof("true")-1)) + *val = 1; + else if (!strncmp(tok, "false", sizeof("false")-1)) + *val = 0; + if (*val != 0 && *val != 1) { + fprintf(stderr,"illegal value for boolean %s=%s\n", name, tok); + return -1; + } + + } + } + return 1; +} + static int load_booleans(struct policydb *policydb, char *path) { FILE *boolf; - char buffer[BUFSIZ]; + char *buffer=NULL; + size_t size=0; + char localbools[BUFSIZ]; char name[BUFSIZ]; - char name1[BUFSIZ]; int val; int errors=0; struct cond_bool_datum *datum; @@ -37,28 +66,29 @@ if (boolf == NULL) return -1; - while (fgets(buffer, sizeof(buffer), boolf)) { - char *tok=strtok(buffer,"="); - if (tok) { - strncpy(name1,tok, BUFSIZ-1); - strtrim(name,name1,BUFSIZ-1); - if ( name[0]=='#' ) continue; - tok=strtok(NULL,"\0"); - if (tok) { - while (isspace(*tok)) tok++; - val = -1; - if (isdigit(tok[0])) - val=atoi(tok); - else if (!strncasecmp(tok, "true", sizeof("true")-1)) - val = 1; - else if (!strncasecmp(tok, "false", sizeof("false")-1)) - val = 0; - if (val != 0 && val != 1) { - fprintf(stderr,"illegal value for boolean %s=%s\n", name, tok); - errors++; - continue; - } - + while (getline(&buffer, &size, boolf) > 0) { + int ret=process_boolean(buffer, name, sizeof(name), &val); + if (ret==-1) + errors++; + if (ret==1) { + datum = hashtab_search(policydb->p_bools.table, name); + if (!datum) { + fprintf(stderr,"unknown boolean %s\n", name); + errors++; + continue; + } + datum->state = val; + } + } + fclose(boolf); + snprintf(localbools,sizeof(localbools), "%s.local", path); + boolf = fopen(localbools,"r"); + if (boolf != NULL) { + while (getline(&buffer, &size, boolf) > 0) { + int ret=process_boolean(buffer, name, sizeof(name), &val); + if (ret==-1) + errors++; + if (ret==1) { datum = hashtab_search(policydb->p_bools.table, name); if (!datum) { fprintf(stderr,"unknown boolean %s\n", name); @@ -68,9 +98,9 @@ datum->state = val; } } + fclose(boolf); } - fclose(boolf); - + free(buffer); if (errors) errno = EINVAL;