[PATCH v2 1/2] Allow deriving the current user's home directory via the HOME variable

Corinna Vinschen corinna-cygwin@cygwin.com
Thu Dec 17 20:20:00 GMT 2015


Hi Johannes,

a few comments...

On Dec 17 19:05, Johannes Schindelin wrote:
> [...]
> diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
> index c9b3e09..a5d6270 100644
> --- a/winsup/cygwin/uinfo.cc
> +++ b/winsup/cygwin/uinfo.cc
> [...]
> +static size_t
> +fetch_env(LPCWSTR key, char *buf, size_t size)
           ^^^
           space

> +{
> +  WCHAR wbuf[32767];

Ok, there are a couple of problems here.  First, since this buffer
is a filename buffer, use NT_MAX_PATH from winsup.h as buffer size.

But then again, please avoid allocating 64K buffers on the stack.
That's what tmp_pathbuf:w_get () is for.

> +  DWORD max = sizeof wbuf / sizeof *wbuf;
> +  DWORD len = GetEnvironmentVariableW (key, wbuf, max);

This call to GetEnvironmentVariableW looks gratuitous to me.  Why don't
you simply call getenv?  It did the entire job already, it avoids the
requirement for a local buffer, and in case of $HOME it even did the
Win32->POSIX path conversion.  If there's a really good reason for using
GetEnvironmentVariableW it begs at least for a longish comment.

> +
> +  if (!len || len >= max)
> +    return 0;
> +
> +  len = sys_wcstombs (buf, size, wbuf, len);
> +  return len && len < size ? len : 0;
> +}
> +
> +static char *
> +fetch_home_env (void)
> +{
> +  char home[32767];
> +  size_t max = sizeof home / sizeof *home, len;
> +
> +  if (fetch_env (L"HOME", home, max)
> +      || ((len = fetch_env (L"HOMEDRIVE", home, max))
> +        && fetch_env (L"HOMEPATH", home + len, max - len))
> +      || fetch_env (L"USERPROFILE", home, max))
> +    {
> +      tmp_pathbuf tp;
> +      cygwin_conv_path (CCP_WIN_A_TO_POSIX | CCP_ABSOLUTE,
> +	  home, tp.c_get(), NT_MAX_PATH);
                       ^^^
                       space
> +      return strdup(tp.c_get());
                     ^^^      ^^^
                     space......s

Whoa, tp.c_get() twice to access the same space?  That's a dirty trick
which may puzzle later readers of the code and heavily depends on
knowing the internals of tmp_pathbuf.  Please use a variable and only
assign tp.c_get () once.

OTOH, the above's a case for a cygwin_create_path call, rather than
cygwin_conv_path+strdup.  Also, if there's *really* a good reason to use
GetEnvironmentVariableW, you should collapse sys_wcstombs+cygwin_conv_path+
strdup into a single cygwin_create_path (CCP_WIN_W_TO_POSIX, ...).

> [...]
> @@ -1079,6 +1123,7 @@ cygheap_pwdgrp::get_shell (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
>  	case NSS_SCHEME_FALLBACK:
>  	  return NULL;
>  	case NSS_SCHEME_WINDOWS:
> +	case NSS_SCHEME_ENV:
>  	  break;
>  	case NSS_SCHEME_CYGWIN:
>  	  if (pldap->fetch_ad_account (sid, false, dnsdomain))

You know that I don't exactly like the "env" idea, but if we implement
it anyway, wouldn't it make sense to add some kind of $SHELL handling as
well, for symmetry?

> [...]
> @@ -1487,6 +1497,16 @@ of each schema when used with <literal>db_home:</literal>
>  	      for a detailed description.</listitem>
>    </varlistentry>
>    <varlistentry>
> +    <term><literal>env</literal></term>
> +    <listitem>Derives the home directory of the current user from the
> +	      environment variable <literal>HOME</literal> (falling back to
> +	      <literal>HOMEDRIVE\HOMEPATH</literal> and
> +	      <literal>USERPROFILE</literal>, in that order).  This is faster
> +	      than the <term><literal>windows</literal></term> schema at the
> +	      expense of determining only the current user's home directory
> +	      correctly.</listitem>

In both case of the documentation it might make sense to add a few words
along the lines of "This schema is skipped for any other account",
wouldn't it?


Thanks,
Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-patches/attachments/20151217/61e3dd5a/attachment.sig>


More information about the Cygwin-patches mailing list