psss / rpms / libselinux

Forked from rpms/libselinux 5 years ago
Clone
Blob Blame History Raw
diff --exclude-from=exclude -N -u -r nsalibselinux/src/matchpathcon.c libselinux-1.21.9/src/matchpathcon.c
--- nsalibselinux/src/matchpathcon.c	2005-01-31 13:50:18.000000000 -0500
+++ libselinux-1.21.9/src/matchpathcon.c	2005-02-10 16:51:59.000000000 -0500
@@ -519,10 +519,13 @@
 {
 	FILE *fp;
 	FILE *localfp;
+	FILE *homedirfp;
 	char local_path[PATH_MAX + 1];
+	char homedir_path[PATH_MAX + 1];
 	char line_buf[BUFSIZ + 1];
 	unsigned int lineno, pass, i, j, maxnspec;
 	spec_t *spec_copy;
+	int status=-1;
 
 	/* Open the specification file. */
 	if (!path)
@@ -530,6 +533,9 @@
 	if ((fp = fopen(path, "r")) == NULL)
 		return -1;
 
+	snprintf(homedir_path, sizeof(homedir_path), "%s.homedirs", path);
+	homedirfp = fopen(homedir_path, "r");
+
 	snprintf(local_path, sizeof(local_path), "%s.local", path);
 	localfp = fopen(local_path, "r");
 
@@ -547,33 +553,41 @@
 		nspec = 0;
 		while (fgets_unlocked(line_buf, sizeof line_buf, fp) && nspec < maxnspec) {
 			if (process_line(path, line_buf, pass, ++lineno) != 0)
-				return -1;
+				goto finish;
 		}
+		if (homedirfp) 
+			while (fgets_unlocked(line_buf, sizeof line_buf, homedirfp) && nspec < maxnspec) {
+				if (process_line(homedir_path, line_buf, pass, ++lineno) != 0)
+					goto finish;
+			}
+
+
 		if (localfp) 
 			while (fgets_unlocked(line_buf, sizeof line_buf, localfp) && nspec < maxnspec) {
 				if (process_line(local_path, line_buf, pass, ++lineno) != 0)
-					return -1;
+					goto finish;
 			}
 
 		if (pass == 0) {
-			if (nspec == 0)
-				return 0;
+			if (nspec == 0) {
+				status = 0;
+				goto finish;
+			}
 			if ((spec_arr = malloc(sizeof(spec_t) * nspec)) ==
 			    NULL)
-				return -1;
+				goto finish;
 			memset(spec_arr, '\0', sizeof(spec_t) * nspec);
 			maxnspec = nspec;
 			rewind(fp);
+			if (homedirfp) rewind(homedirfp);
 			if (localfp) rewind(localfp);
 		}
 	}
-	fclose(fp);
-	if (localfp) fclose(localfp);
 
 	/* Move exact pathname specifications to the end. */
 	spec_copy = malloc(sizeof(spec_t) * nspec);
 	if (!spec_copy)
-		return -1;
+		goto finish;
 	j = 0;
 	for (i = 0; i < nspec; i++) {
 		if (spec_arr[i].hasMetaChars)
@@ -588,7 +602,13 @@
 
 	nodups_specs(path);
 
-	return 0;
+	status = 0;
+ finish:
+	fclose(fp);
+	if (spec_arr != spec_copy) free(spec_arr);
+	if (homedirfp) fclose(homedirfp);
+	if (localfp) fclose(localfp);
+	return status;
 }
 hidden_def(matchpathcon_init)