psss / rpms / libsemanage

Forked from rpms/libsemanage 5 years ago
Clone
0984542
diff --git a/libsemanage/src/Makefile b/libsemanage/src/Makefile
727c0db
index d21e972..d9120c0 100644
0984542
--- a/libsemanage/src/Makefile
0984542
+++ b/libsemanage/src/Makefile
727c0db
@@ -10,7 +10,8 @@ LIBDIR ?= $(PREFIX)/lib
0984542
 SHLIBDIR ?= $(PREFIX)/lib
0984542
 INCLUDEDIR ?= $(PREFIX)/include
727c0db
 PYLIBVER ?= $(shell $(PYTHON) -c 'import sys;print("python%d.%d" % sys.version_info[0:2])')
727c0db
-PYINC ?= $(shell pkg-config --cflags `basename $(PYTHON)`)
727c0db
+PYINC ?= $(shell pkg-config --cflags $(PYPREFIX))
727c0db
+PYTHONLIBDIR ?= $(shell pkg-config --libs $(PYPREFIX))
727c0db
 PYLIBDIR ?= $(LIBDIR)/$(PYLIBVER)
0984542
 RUBYLIBVER ?= $(shell ruby -e 'print RUBY_VERSION.split(".")[0..1].join(".")')
0984542
 RUBYPLATFORM ?= $(shell ruby -e 'print RUBY_PLATFORM')
727c0db
@@ -76,7 +77,7 @@ $(SWIGRUBYLOBJ): $(SWIGRUBYCOUT)
727c0db
 	$(CC) $(filter-out -Werror, $(CFLAGS)) -I$(RUBYINC) -fPIC -DSHARED -c -o $@ $<
0984542
 
0984542
 $(SWIGSO): $(SWIGLOBJ)
727c0db
-	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $< -L. -lsemanage -L$(LIBDIR) -Wl,-soname,$@,-z,defs
727c0db
+	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $< -L. -lsemanage -L$(LIBDIR) $(PYTHONLIBDIR) -Wl,-soname,$@,-z,defs
0984542
 
0984542
 $(SWIGRUBYSO): $(SWIGRUBYLOBJ)
0984542
 	$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $^ -L. -lsemanage -L$(LIBDIR) -Wl,-soname,$@
0984542
diff --git a/libsemanage/src/direct_api.c b/libsemanage/src/direct_api.c
727c0db
index aac1974..3dfa279 100644
0984542
--- a/libsemanage/src/direct_api.c
0984542
+++ b/libsemanage/src/direct_api.c
410db78
@@ -353,17 +353,11 @@ static int parse_module_headers(semanage_handle_t * sh, char *module_data,
410db78
 	     semanage_path(SEMANAGE_TMP, SEMANAGE_MODULES)) == NULL) {
410db78
 		return -1;
410db78
 	}
410db78
-	if (asprintf(filename, "%s/%s.pp%s", module_path, *module_name, DISABLESTR) == -1) {
410db78
+	if (asprintf(filename, "%s/%s.pp", module_path, *module_name) == -1) {
410db78
 		ERR(sh, "Out of memory!");
410db78
 		return -1;
410db78
 	}
410db78
 
410db78
-	if (access(*filename, F_OK) == -1) {
410db78
-		char *ptr = *filename;
410db78
-		int len = strlen(ptr) - strlen(DISABLESTR);
410db78
-		if (len > 0) ptr[len]='\0';
410db78
-	}
410db78
-
410db78
 	return 0;
410db78
 }
410db78
 
410db78
@@ -1307,29 +1301,12 @@ static int semanage_direct_enable(semanage_handle_t * sh, char *module_name)
410db78
 		base++;
410db78
 		if (memcmp(module_name, base, name_len) == 0) {
410db78
 
410db78
-			if(strcmp(base + name_len + 3, DISABLESTR) != 0) {
410db78
-				ERR(sh, "Module %s is already enabled.", module_name);
410db78
+			if (semanage_enable_module(module_filenames[i]) < 0) {
410db78
+				ERR(sh, "Could not enable module %s.", module_name);
410db78
 				retval = -2;
410db78
 				goto cleanup;
410db78
 			}
410db78
-
410db78
-			int len = strlen(module_filenames[i]) - strlen(DISABLESTR);
410db78
-			char *enabled_name = calloc(1, len+1);
410db78
-			if (!enabled_name) {
410db78
-				ERR(sh, "Could not allocate memory");
410db78
-				retval = -1;
410db78
-				goto cleanup;
410db78
-			}
410db78
-
410db78
-			strncpy(enabled_name, module_filenames[i],len);
410db78
-
410db78
-			if (rename(module_filenames[i], enabled_name) == -1) {
410db78
-				ERR(sh, "Could not enable module file %s.",
410db78
-				    enabled_name);
410db78
-				retval = -2;
410db78
-			}
410db78
 			retval = 0;
410db78
-			free(enabled_name);
410db78
 			goto cleanup;
410db78
 		}
410db78
 	}
410db78
@@ -1363,28 +1340,14 @@ static int semanage_direct_disable(semanage_handle_t * sh, char *module_name)
410db78
 			goto cleanup;
410db78
 		}
410db78
 		base++;
410db78
-		if (memcmp(module_name, base, name_len) == 0) {
410db78
-			if (strcmp(base + name_len + 3, DISABLESTR) == 0) {
410db78
-				ERR(sh, "Module %s is already disabled.", module_name);
410db78
+		if ((memcmp(module_name, base, name_len) == 0) &&
410db78
+		    (strcmp(base + name_len, ".pp") == 0)) {
410db78
+			if (semanage_disable_module(module_filenames[i]) < 0) {
410db78
 				retval = -2;
410db78
 				goto cleanup;
410db78
-			} else if (strcmp(base + name_len, ".pp") == 0) {
410db78
-				char disabled_name[PATH_MAX];
410db78
-				if (snprintf(disabled_name, PATH_MAX, "%s%s", 
410db78
-							module_filenames[i], DISABLESTR) == PATH_MAX) {
410db78
-					ERR(sh, "Could not disable module file %s.",
410db78
-							module_filenames[i]);
410db78
-					retval = -2;
410db78
-					goto cleanup;
410db78
-				}
410db78
-				if (rename(module_filenames[i], disabled_name) == -1) {
410db78
-					ERR(sh, "Could not disable module file %s.",
410db78
-							module_filenames[i]);
410db78
-					retval = -2;
410db78
-				}
410db78
-				retval = 0;
410db78
-				goto cleanup;
410db78
 			}
410db78
+			retval=0;
410db78
+			goto cleanup;
410db78
 		}
410db78
 	}
410db78
 	ERR(sh, "Module %s was not found.", module_name);
c00e96c
@@ -1418,6 +1381,7 @@ static int semanage_direct_remove(semanage_handle_t * sh, char *module_name)
c00e96c
 		}
c00e96c
 		base++;
c00e96c
 		if (memcmp(module_name, base, name_len) == 0) {
c00e96c
+			semanage_enable_module(module_filenames[i]);
c00e96c
 			if (unlink(module_filenames[i]) == -1) {
c00e96c
 				ERR(sh, "Could not remove module file %s.",
c00e96c
 				    module_filenames[i]);
6120de7
diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c
727c0db
index 847d87e..2870fa8 100644
6120de7
--- a/libsemanage/src/genhomedircon.c
6120de7
+++ b/libsemanage/src/genhomedircon.c
727c0db
@@ -314,6 +314,8 @@ static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s)
b1238c4
 		}
b1238c4
 		if (strcmp(pwbuf->pw_dir, "/") == 0)
b1238c4
 			continue;
727c0db
+		if (strcmp(pwbuf->pw_dir, "/root") == 0)
b1238c4
+			continue;
b1238c4
 		if (semanage_str_count(pwbuf->pw_dir, '/') <= 1)
b1238c4
 			continue;
b1238c4
 		if (!(path = strdup(pwbuf->pw_dir))) {
727c0db
@@ -829,6 +831,8 @@ static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s,
b1238c4
 			 * /root */
b1238c4
 			continue;
b1238c4
 		}
727c0db
+		if (strcmp(pwent->pw_dir, "/root") == 0)
b1238c4
+			continue;
b1238c4
 		if (push_user_entry(&head, name, seuname,
727c0db
 				    prefix, pwent->pw_dir, level) != STATUS_SUCCESS) {
b1238c4
 			*errors = STATUS_ERR;
0984542
diff --git a/libsemanage/src/semanage_store.c b/libsemanage/src/semanage_store.c
727c0db
index 8d6ff1c..37b0c7a 100644
0984542
--- a/libsemanage/src/semanage_store.c
0984542
+++ b/libsemanage/src/semanage_store.c
410db78
@@ -57,7 +57,7 @@ typedef struct dbase_policydb dbase_t;
410db78
 
410db78
 #include "debug.h"
410db78
 
410db78
-const char *DISABLESTR=".disabled";
410db78
+static const char *DISABLESTR="disabled";
410db78
 
410db78
 #define SEMANAGE_CONF_FILE "semanage.conf"
410db78
 /* relative path names to enum semanage_paths to special files and
727c0db
@@ -425,6 +425,13 @@ int semanage_store_access_check(void)
410db78
 
410db78
 /********************* other I/O functions *********************/
410db78
 
410db78
+static int is_disabled_file(const char *file) {
410db78
+	char *ptr = strrchr(file, '.');
410db78
+	if (! ptr) return 0;
410db78
+	ptr++;
410db78
+	return (strcmp(ptr, DISABLESTR) == 0);
410db78
+}
410db78
+
410db78
 /* Callback used by scandir() to select files. */
410db78
 static int semanage_filename_select(const struct dirent *d)
410db78
 {
c00e96c
@@ -435,11 +442,41 @@ static int semanage_filename_select(const struct dirent *d)
410db78
 	return 1;
410db78
 }
410db78
 
410db78
+int semanage_disable_module(const char *file) {
410db78
+	char path[PATH_MAX];
410db78
+	int in;
410db78
+	int n = snprintf(path, PATH_MAX, "%s.%s", file, DISABLESTR);
410db78
+	if (n < 0 || n >= PATH_MAX)
410db78
+		return -1;
568e47f
+	if ((in = open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
410db78
+		return -1;
410db78
+	}
410db78
+	close(in);
410db78
+	return 0;
410db78
+}
410db78
+
410db78
+int semanage_enable_module(const char *file) {
410db78
+	char path[PATH_MAX];
410db78
+	int n = snprintf(path, PATH_MAX, "%s.%s", file, DISABLESTR);
410db78
+	if (n < 0 || n >= PATH_MAX)
410db78
+		return 1;
410db78
+
410db78
+	if ((unlink(path) < 0) && (errno != ENOENT))
410db78
+		return -1;
410db78
+	return 0;
410db78
+}
410db78
+
410db78
 int semanage_module_enabled(const char *file) {
410db78
-	int len = strlen(file) - strlen(DISABLESTR);
410db78
-	return (len < 0 || strcmp(&file[len], DISABLESTR) != 0);
410db78
+	char path[PATH_MAX];
410db78
+	if (is_disabled_file(file)) return 0;
410db78
+	int n = snprintf(path, PATH_MAX, "%s.%s", file, DISABLESTR);
410db78
+	if (n < 0 || n >= PATH_MAX)
410db78
+		return 1;
410db78
+
410db78
+	return (access(path, F_OK ) != 0);
410db78
 }
410db78
 
c00e96c
+/* Callback used by scandir() to select module files. */
410db78
 static int semanage_modulename_select(const struct dirent *d)
c00e96c
 {
c00e96c
 	if (d->d_name[0] == '.'
c00e96c
@@ -447,7 +484,7 @@ static int semanage_modulename_select(const struct dirent *d)
c00e96c
 		|| (d->d_name[1] == '.' && d->d_name[2] == '\0')))
c00e96c
 		return 0;
c00e96c
 
c00e96c
-	return semanage_module_enabled(d->d_name);
c00e96c
+	return (! is_disabled_file(d->d_name));
c00e96c
 }
c00e96c
 
c00e96c
 /* Copies a file from src to dst.  If dst already exists then
c00e96c
@@ -684,7 +721,7 @@ int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames,
c00e96c
 			       int *len)
c00e96c
 {
c00e96c
 	return semanage_get_modules_names_filter(sh, filenames,
c00e96c
-						 len, semanage_filename_select);
c00e96c
+						 len, semanage_modulename_select);
c00e96c
 }
c00e96c
 
c00e96c
 /* Scans the modules directory for the current semanage handler.  This
c00e96c
@@ -697,8 +734,25 @@ int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames,
c00e96c
 int semanage_get_active_modules_names(semanage_handle_t * sh, char ***filenames,
c00e96c
 			       int *len)
c00e96c
 {
c00e96c
-	return semanage_get_modules_names_filter(sh, filenames,
c00e96c
-						 len, semanage_modulename_select);
c00e96c
+
c00e96c
+	int rc = semanage_get_modules_names_filter(sh, filenames,
c00e96c
+						   len, semanage_modulename_select);
c00e96c
+	if ( rc != 0 ) return rc;
c00e96c
+
c00e96c
+	int i = 0, num_modules = *len;
c00e96c
+	char **names=*filenames;
727c0db
+
c00e96c
+	while ( i < num_modules ) {
c00e96c
+		if (! semanage_module_enabled(names[i])) {
c00e96c
+			free(names[i]);
c00e96c
+			names[i]=names[num_modules-1];
c00e96c
+			names[num_modules-1] = NULL;
c00e96c
+			num_modules--;
c00e96c
+		}
c00e96c
+		i++;
c00e96c
+	}
c00e96c
+	*len = num_modules;
c00e96c
+	return 0;
c00e96c
 }
c00e96c
 
c00e96c
 /******************* routines that run external programs *******************/
410db78
diff --git a/libsemanage/src/semanage_store.h b/libsemanage/src/semanage_store.h
727c0db
index a0b2dd8..e980cdc 100644
410db78
--- a/libsemanage/src/semanage_store.h
410db78
+++ b/libsemanage/src/semanage_store.h
410db78
@@ -85,6 +85,8 @@ int semanage_get_modules_names(semanage_handle_t * sh,
410db78
 			       char ***filenames, int *len);
410db78
 
410db78
 int semanage_module_enabled(const char *file);
410db78
+int semanage_enable_module(const char *file);
410db78
+int semanage_disable_module(const char *file);
410db78
 /* lock file routines */
410db78
 int semanage_get_trans_lock(semanage_handle_t * sh);
410db78
 int semanage_get_active_lock(semanage_handle_t * sh);
410db78
@@ -129,6 +131,4 @@ int semanage_nc_sort(semanage_handle_t * sh,
410db78
 		     size_t buf_len,
410db78
 		     char **sorted_buf, size_t * sorted_buf_len);
410db78
 
410db78
-extern const char *DISABLESTR;
410db78
-
410db78
 #endif