Hi,

        There was a brown paper bag bug in my use of matchpathcon; I
 was looking for the security context of the temporary file, not the
 final destination, and these can be very different. The relevant fix
 is in [EMAIL PROTECTED]/dpkg--selinux--1.13, and
 relative to the previous  patch is:
----------------------------------------------------------------------
--- orig/src/archives.c
+++ mod/src/archives.c
@@ -540,7 +540,7 @@
      * or if it has no context; in which case the default
      * context shall be applied.
      */
-    if( ! ((matchpathcon(fnamenewvb.buf,
+    if( ! ((matchpathcon(fnamevb.buf,
                          (nifd->namenode->statoverride ?
                           nifd->namenode->statoverride->mode : ti->Mode)
                          & ~S_IFMT, &scontext) != 0) ||


----------------------------------------------------------------------

        However, I am also attaching the full patch, corrected with
 the above fix, below.

        manoj

* looking for [EMAIL PROTECTED]/dpkg--devel--1.13--patch-43 to compare with
tla library-add --sparse [EMAIL PROTECTED]/dpkg--devel--1.13--patch-43
* comparing to [EMAIL PROTECTED]/dpkg--devel--1.13--patch-43: ................................................. done.

* modified files

--- orig/ChangeLog
+++ mod/ChangeLog
@@ -1,3 +1,23 @@
+2005-06-28  Manoj Srivastava  <[EMAIL PROTECTED]>
+
+	* src/archives.c:
+		  [EMAIL PROTECTED]/dpkg--selinux--1.13--patch-4
+		  Get security context for the final path fnamevb.buf, not
+		  the temporary path fnamenewvb.buf 
+
+2005-06-18  Manoj Srivastava  <[EMAIL PROTECTED]>
+
+	* src/archives.c: Include selinux/selinux.h if WITH_SELINUX is
+	  defined. Before extracting the tar object, find out the initial
+	  security context for the object to be extracted, as per the
+	  local security policy, using matchpathcon(), and set the default
+	  security context for the process using
+	  setfscreatecon(). After this we proceed to process the
+	  tarobject normally, setting owner and permissions, and
+	  renaming it from foo.dpkg-new to foo. After that, we
+	  step back in, and restore the default security context.
+	  
+
 2005-06-15  Bastian Kleineidam  <[EMAIL PROTECTED]>
 
 	* man/C/dpkg.cfg.5: Correct reference to dpkg(8) to dpkg(1).


--- orig/debian/changelog
+++ mod/debian/changelog
@@ -11,6 +11,14 @@
     - Added missing word to dpkg-architecture manpage.  Closes: #313554.
     - Reference to dpkg manpage in dpkg.cfg corrected.  Closes: #314262.
 
+  SELinux support (Manoj Srivastava):
+  * Also patch src/archive.c, which is the code that is actually
+    called. Use a slightly different method than what we used in
+    lib/star.c -- here we temporarily set the default security context of
+    the process to the one required to create the file being unpacked in
+    the proper initial context, and then restore the policy defined
+    default after unpacking and renaming.
+
  --
 
 dpkg (1.13.9) unstable; urgency=low


--- orig/src/archives.c
+++ mod/src/archives.c
@@ -43,6 +43,12 @@
 #include <tarfn.h>
 #include <myopt.h>
 
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+static int selinux_enabled=-1;
+static security_context_t scontext    = NULL;
+#endif
+
 #include "filesdb.h"
 #include "main.h"
 #include "archives.h"
@@ -515,6 +521,38 @@
    */
   push_cleanup(cu_installnew,~ehflag_normaltidy, 0,0, 1,(void*)nifd);
 
+#ifdef WITH_SELINUX
+  /* Set selinux_enabled if it is not already set (singleton) */
+  if (selinux_enabled < 0)
+    selinux_enabled = (is_selinux_enabled() > 0);
+
+  /* Since selinux is enabled, try and set the context */
+  if (selinux_enabled == 1) {
+    /*
+     * well, we could use
+     *   void set_matchpathcon_printf(void (*f)(const char *fmt, ...));
+     * to redirect the errors from the following bit, but that
+     * seems too much effort.
+     */
+
+    /*
+     * Do nothing if we can't figure out what the context is,
+     * or if it has no context; in which case the default
+     * context shall be applied.
+     */
+    if( ! ((matchpathcon(fnamevb.buf,
+                         (nifd->namenode->statoverride ?
+                          nifd->namenode->statoverride->mode : ti->Mode)
+                         & ~S_IFMT, &scontext) != 0) ||
+           (strcmp(scontext, "<<none>>") == 0)))
+     {
+       if(setfscreatecon(scontext) < 0)
+         perror("Error setting security context for file object:");
+     }
+  }
+#endif /* WITH_SELINUX */
+
+
   /* Extract whatever it is as .dpkg-new ... */
   switch (ti->Type) {
   case NormalFile0: case NormalFile1:
@@ -655,9 +693,34 @@
     }
   }
 
+#ifdef WITH_SELINUX
+  /*
+   * if selinux is enabled, try and set the defaule security context
+   * for the renamed file
+   */
+  if (selinux_enabled == 1)
+    if(scontext)
+     {
+       if(setfscreatecon(scontext) < 0)
+         perror("Error setting security context for next file object:");
+       freecon(scontext);
+     }
+        
+#endif /* WITH_SELINUX */
+
   if (rename(fnamenewvb.buf,fnamevb.buf))
     ohshite(_("unable to install new version of `%.255s'"),ti->Name);
 
+#ifdef WITH_SELINUX
+  /*
+   * if selinux is enabled, restore the default security context
+   */
+  if (selinux_enabled == 1)
+    if(setfscreatecon(NULL) < 0)
+      perror("Error restoring default security context:");
+#endif /* WITH_SELINUX */
+
+
   nifd->namenode->flags |= fnnf_elide_other_lists;
 
   debug(dbg_eachfiledetail,"tarobject done and installed");




-- 
Friction is a drag.
Manoj Srivastava   <[EMAIL PROTECTED]>  <http://www.datasync.com/%7Esrivasta/>
1024D/BF24424C print 4966 F272 D093 B493 410B  924B 21BA DABB BF24 424C

Reply via email to