Jan F. Chadima 3d6b00
diff -up openssh-5.2p1/session.c.sesftp openssh-5.2p1/session.c
Jan F. Chadima 56bb42
--- openssh-5.2p1/session.c.sesftp	2009-08-09 10:21:11.586827446 +0200
Jan F. Chadima 56bb42
+++ openssh-5.2p1/session.c	2009-08-09 10:39:30.475622699 +0200
Jan F. Chadima 56bb42
@@ -58,6 +58,9 @@
Jan F. Chadima 3d6b00
 #include <stdlib.h>
Jan F. Chadima 3d6b00
 #include <string.h>
Jan F. Chadima 3d6b00
 #include <unistd.h>
Jan F. Chadima 56bb42
+#ifdef WITH_SELINUX
Jan F. Chadima 3d6b00
+#include <selinux/selinux.h>
Jan F. Chadima 56bb42
+#endif
Jan F. Chadima 3d6b00
 
Jan F. Chadima 3d6b00
 #include "openbsd-compat/sys-queue.h"
Jan F. Chadima 3d6b00
 #include "xmalloc.h"
Jan F. Chadima 56bb42
@@ -101,6 +104,9 @@
Jan F. Chadima 56bb42
 	  c[sizeof(INTERNAL_SFTP_NAME) - 1] == ' ' || \
Jan F. Chadima 56bb42
 	  c[sizeof(INTERNAL_SFTP_NAME) - 1] == '\t'))
Jan F. Chadima a827fe
 
Jan F. Chadima 56bb42
+#ifdef WITH_SELINUX
Jan F. Chadima 56bb42
+#define SFTPD_T		"sftpd_t"
Jan F. Chadima 56bb42
+#endif
Jan F. Chadima 56bb42
 /* func */
Jan F. Chadima 56bb42
 
Jan F. Chadima 56bb42
 Session *session_new(void);
Jan F. Chadima 56bb42
@@ -1789,6 +1795,10 @@ do_child(Session *s, const char *command
Jan F. Chadima a827fe
 		extern int optind, optreset;
Jan F. Chadima 56bb42
 		int i;
Jan F. Chadima 56bb42
 		char *p, *args;
Jan F. Chadima 56bb42
+#ifdef WITH_SELINUX
Jan F. Chadima 56bb42
+		int L1, L2;
Jan F. Chadima 56bb42
+		char *c1, *c2, *cx;
Jan F. Chadima 56bb42
+#endif
Jan F. Chadima a827fe
 
Jan F. Chadima a827fe
 		setproctitle("%s@internal-sftp-server", s->pw->pw_name);
Jan F. Chadima a827fe
 		args = xstrdup(command ? command : "sftp-server");
Jan F. Chadima 56bb42
@@ -1798,6 +1808,32 @@ do_child(Session *s, const char *command
Jan F. Chadima 3d6b00
 		argv[i] = NULL;
Jan F. Chadima 3d6b00
 		optind = optreset = 1;
Jan F. Chadima 3d6b00
 		__progname = argv[0];
Jan F. Chadima 56bb42
+#ifdef WITH_SELINUX
Jan F. Chadima 56bb42
+		if (getcon ((security_context_t *) &c1) < 0) {
Jan F. Chadima 56bb42
+			logit("do_child: getcon failed with %s", strerror (errno));
Jan F. Chadima a827fe
+		} else {
Jan F. Chadima 56bb42
+			L1 = strlen (c1) + sizeof (SFTPD_T);
Jan F. Chadima 56bb42
+			c2 = xmalloc (L1);
Jan F. Chadima a827fe
+			if (!(cx = index (c1, ':')))
Jan F. Chadima a827fe
+				goto badcontext;
Jan F. Chadima a827fe
+			if (!(cx = index (cx + 1, ':'))) {
Jan F. Chadima a827fe
+badcontext:
Jan F. Chadima a827fe
+				logit ("do_child: unparseable context %s", c1);
Jan F. Chadima a827fe
+			} else {
Jan F. Chadima 56bb42
+				L2 = cx - c1 + 1;
Jan F. Chadima 56bb42
+				memcpy (c2, c1, L2);
Jan F. Chadima 56bb42
+				strlcpy (c2 + L2, SFTPD_T, L1);
Jan F. Chadima a827fe
+				if ((cx = index (cx + 1, ':')))
Jan F. Chadima 56bb42
+					strlcat (c2, cx, L1);
Jan F. Chadima 170a77
+				if (setcon (c2) < 0) 
Jan F. Chadima 56bb42
+					logit("do_child: setcon failed with %s", strerror (errno));
Jan F. Chadima a827fe
+			
Jan F. Chadima a827fe
+			}
Jan F. Chadima 56bb42
+			xfree (c1);
Jan F. Chadima 56bb42
+			xfree (c2);
Jan F. Chadima a827fe
+		}		
Jan F. Chadima 56bb42
+#endif
Jan F. Chadima f35d4a
+			
Jan F. Chadima 3d6b00
 		exit(sftp_server_main(i, argv, s->pw));
Jan F. Chadima 3d6b00
 	}
Jan F. Chadima 3d6b00