111 lines
2.8 KiB
Diff
111 lines
2.8 KiB
Diff
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;
|
|
|