[PATCH] Only copy basic Windows environment (was Re: Pending OpenSSH release, call for testing.)
Damien Miller
djm at mindrot.org
Mon Aug 16 10:20:45 EST 2004
Thanks.
Could you create a bug for this in bugzilla and attach the patch? It is
a bit to late for this release, but I don't want it to get lost.
-d
Corinna Vinschen wrote:
> 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
>
More information about the openssh-unix-dev
mailing list