[PATCH] Only copy basic Windows environment (was Re: Pending OpenSSH release, call for testing.)

Corinna Vinschen vinschen at redhat.com
Fri Aug 13 22:45:20 EST 2004


On Aug 13 20:18, Damien Miller wrote:
> Darren Tucker wrote:
> > This appears to be due to this fragment of session.c:
> > 
> > #ifdef HAVE_CYGWIN
> >          /*
> >           * The Windows environment contains some setting which are
> >           * important for a running system. They must not be dropped.
> >           */
> >          copy_environment(environ, &env, &envsize);
> 
> I'd really like to see this restricted to copy just the environment
> variables that are needed.

Like this?

Index: session.c
===================================================================
RCS file: /cvs/openssh_cvs/session.c,v
retrieving revision 1.287
diff -p -u -r1.287 session.c
--- session.c	12 Aug 2004 12:40:25 -0000	1.287
+++ session.c	13 Aug 2004 12:41:28 -0000
@@ -979,7 +979,13 @@ do_setup_env(Session *s, const char *she
 	 * The Windows environment contains some setting which are
 	 * important for a running system. They must not be dropped.
 	 */
-	copy_environment(environ, &env, &envsize);
+	{
+		char **p;
+
+		p = fetch_windows_environment();
+		copy_environment(p, &env, &envsize);
+		free_windows_environment(p);
+	}
 #endif
 
 #ifdef GSSAPI
Index: openbsd-compat/bsd-cygwin_util.c
===================================================================
RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.c,v
retrieving revision 1.12
diff -p -u -r1.12 bsd-cygwin_util.c
--- openbsd-compat/bsd-cygwin_util.c	18 Apr 2004 11:15:45 -0000	1.12
+++ openbsd-compat/bsd-cygwin_util.c	13 Aug 2004 12:41:28 -0000
@@ -38,6 +38,7 @@ RCSID("$Id: bsd-cygwin_util.c,v 1.12 200
 #include <sys/utsname.h>
 #include <sys/vfs.h>
 #include <windows.h>
+#include "xmalloc.h"
 #define is_winnt       (GetVersion() < 0x80000000)
 
 #define ntsec_on(c)	((c) && strstr((c),"ntsec") && !strstr((c),"nontsec"))
@@ -96,7 +97,6 @@ has_capability(int what)
 	 */
 	if (!inited) {
 		struct utsname uts;
-		char *c;
 		
 		if (!uname(&uts)) {
 			int major_high = 0, major_low = 0, minor = 0;
@@ -234,6 +234,59 @@ register_9x_service(void)
 		GetProcAddress(kerneldll, "RegisterServiceProcess")))
 		return;
 	RegisterServiceProcess(0, 1);
+}
+
+#define NL(x) x, (sizeof (x) - 1)
+#define WENV_SIZ (sizeof (wenv_arr) / sizeof (wenv_arr[0]))
+
+static struct wenv {
+	const char *name;
+	size_t namelen;
+} wenv_arr[] = {
+	{ NL("ALLUSERSPROFILE=") },
+	{ NL("COMMONPROGRAMFILES=") },
+	{ NL("COMPUTERNAME=") },
+	{ NL("COMSPEC=") },
+	{ NL("NUMBER_OF_PROCESSORS=") },
+	{ NL("OS=") },
+	{ NL("PATH=") },
+	{ NL("PATHEXT=") },
+	{ NL("PROCESSOR_ARCHITECTURE=") },
+	{ NL("PROCESSOR_IDENTIFIER=") },
+	{ NL("PROCESSOR_LEVEL=") },
+	{ NL("PROCESSOR_REVISION=") },
+	{ NL("PROGRAMFILES=") },
+	{ NL("SYSTEMDRIVE=") },
+	{ NL("SYSTEMROOT=") },
+	{ NL("TMP=") },
+	{ NL("TEMP=") },
+	{ NL("WINDIR=") },
+};
+
+char **
+fetch_windows_environment(void)
+{
+	char **e, **p;
+	int i, idx = 0;
+
+	p = xmalloc(WENV_SIZ * sizeof(char *));
+	p[idx] = NULL;
+	for (e = environ; *e; ++e) {
+		for (i = 0; i < WENV_SIZ; ++i) {
+			if (!strncmp(*e, wenv_arr[i].name,
+				     wenv_arr[i].namelen)) {
+				p[idx] = *e;
+				p[++idx] = NULL;
+			}
+		}
+	}
+	return p;
+}
+
+void
+free_windows_environment(char **p)
+{
+	xfree(p);
 }
 
 #endif /* HAVE_CYGWIN */
Index: openbsd-compat/bsd-cygwin_util.h
===================================================================
RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.h,v
retrieving revision 1.10
diff -p -u -r1.10 bsd-cygwin_util.h
--- openbsd-compat/bsd-cygwin_util.h	7 Aug 2003 06:28:16 -0000	1.10
+++ openbsd-compat/bsd-cygwin_util.h	13 Aug 2004 12:41:28 -0000
@@ -46,6 +46,8 @@ int binary_pipe(int fd[2]);
 int check_nt_auth(int, struct passwd *);
 int check_ntsec(const char *);
 void register_9x_service(void);
+char **fetch_windows_environment(void);
+void free_windows_environment(char **);
 
 #define open binary_open
 #define pipe binary_pipe


Corinna

-- 
Corinna Vinschen
Cygwin Co-Project Leader
Red Hat, Inc.




More information about the openssh-unix-dev mailing list