Blob Blame History Raw
diff -urNp coreutils-6.11-orig/src/install.c coreutils-6.11/src/install.c
--- coreutils-6.11-orig/src/install.c	2008-05-20 16:08:03.000000000 +0200
+++ coreutils-6.11/src/install.c	2008-05-20 16:12:27.000000000 +0200
@@ -85,6 +85,7 @@ static bool install_file_in_dir (const c
 				 const struct cp_options *x);
 static bool install_file_in_file (const char *from, const char *to,
 				  const struct cp_options *x);
+static void set_prefix (const char* from_dir, const char* to_dir);
 static void get_ids (void);
 static void strip (char const *name);
 static void announce_mkdir (char const *dir, void *options);
@@ -200,25 +201,25 @@ cp_option_init (struct cp_options *x)
   x->src_info = NULL;
 }
 
-/* Modify file context to match the specified policy.
-   If an error occurs the file will remain with the default directory
-   context.  */
-static void
-setdefaultfilecon (char const *file)
+static void 
+set_prefix (char const *from_dir, char const *to_dir)
 {
+  const char *from_base = last_component (from_dir);
+  char *file = file_name_concat (to_dir, from_base, NULL);
   struct stat st;
-  security_context_t scontext = NULL;
+  
   if (selinux_enabled != 1)
     {
       /* Indicate no context found. */
       return;
     }
+
   if (lstat (file, &st) != 0)
     return;
 
   if (IS_ABSOLUTE_FILE_NAME (file))
     {
-      /* Calling matchpathcon_init_prefix (NULL, "/first_component/")
+         /* Calling matchpathcon_init_prefix (NULL, "/first_component/")
 	 is an optimization to minimize the expense of the following
 	 matchpathcon call.  */
       char const *p0;
@@ -248,6 +249,26 @@ setdefaultfilecon (char const *file)
 	}
     }
 
+  return;
+}
+
+/* Modify file context to match the specified policy.
+   If an error occurs the file will remain with the default directory
+   context.  */
+static void
+setdefaultfilecon (char const *file)
+{
+  struct stat st;
+  security_context_t scontext = NULL;
+  return;
+  if (selinux_enabled != 1)
+    {
+      /* Indicate no context found. */
+      return;
+    }
+  if (lstat (file, &st) != 0)
+    return;
+
   /* If there's an error determining the context, or it has none,
      return to allow default context */
   if ((matchpathcon (file, st.st_mode, &scontext) != 0) ||
@@ -526,9 +547,13 @@ main (int argc, char **argv)
 	{
 	  int i;
 	  dest_info_init (&x);
-	  for (i = 0; i < n_files; i++)
+	  set_prefix (file[0], target_directory);
+	  for (i = 0; i < n_files; i++) {
 	    if (! install_file_in_dir (file[i], target_directory, &x))
 	      exit_status = EXIT_FAILURE;
+          }
+	  if (selinux_enabled)
+	    matchpathcon_fini();
 	}
     }