bug-wget
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-wget] [PATCH v4] (resend) Add --use-askpass=COMMAND support


From: Liam R. Howlett
Subject: Re: [Bug-wget] [PATCH v4] (resend) Add --use-askpass=COMMAND support
Date: Wed, 7 Sep 2016 12:15:26 -0400
User-agent: Mutt/1.5.23 (2014-03-12)

* Tim Ruehsen <address@hidden> [160907 04:49]:
> Hi Liam,
> 
> I made a mistake and accidentally pushed your v4 patch to master a few days 
> ago.
> 
> Here is a fix for several issues (warnings, C89 incompatibility, using 
> strpbrk 
> to find end-of-line, append newline to error messages).
> 
> I removed your extra checks, so that a user can just work with executables in 
> the PATH (posix_spawnp searches the path):
>   wget --use-askpass=ssh-askpass <URL>
> 
> If the executable does not exists (or something goes wrong when executing), 
> wget will error & stop at that point anyways.
> 
> Here is the fix, WDYT ?

I like the change to use strpbrk.  This patch works with my testing.

Just a few comments:


1. Since you are using xmemdup0, can't you also drop these lines?
(1101-1102):
      /* Make sure there is a trailing 0 */
            tmp[bytes] = '\0';

I think you can change the read line to remove the -1 from the size of
the read (line 1092) if you drop the above:

- bytes = read (com[0], tmp, sizeof (tmp) - 1);
+ bytes = read (com[0], tmp, sizeof (tmp));


2. Is there a whitespace issue here?
+  if ((p = strpbrk(tmp, "\r\n")))
                   ^- Whitespace missing?

Thanks,
Liam

> 
> Regards, Tim

> From=20afb66eb94f5e5c4a0cbfed6a1e95d08418bc0dd6 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Tim=20R=C3=BChsen?= <address@hidden>
> Date: Wed, 7 Sep 2016 10:40:43 +0200
> Subject: [PATCH] Code cleanup for --use-askpass
> 
> * bootstrap.conf: Add xmemdup0 and strpbrk.
> * src/init.c (cmd_use_askpass): Add 'const' to char *,
>   remove check for file existence.
> * src/main.c (run_use_askpass): C89 compat init of argv,
>   added \n to error messages,
>   fixed stripping of \n and \r from input,
>   make run_use_askpass and use_askpass static.
> ---
>  bootstrap.conf |  2 ++
>  src/init.c     | 20 +++-----------------
>  src/main.c     | 33 ++++++++++++++++++++-------------
>  3 files changed, 25 insertions(+), 30 deletions(-)
> 
> diff --git a/bootstrap.conf b/bootstrap.conf
> index e839277..e706a37 100644
> --- a/bootstrap.conf
> +++ b/bootstrap.conf
> @@ -90,6 +90,7 @@ stdbool
>  stdint
>  strcase
>  strerror_r-posix
> +strpbrk
>  strptime
>  strtok_r
>  strtoll
> @@ -102,6 +103,7 @@ update-copyright
>  vasprintf
>  vsnprintf
>  write
> +xmemdup0
>  xstrndup
>  "
>  
> diff --git a/src/init.c b/src/init.c
> index dbf356a..b7f573a 100644
> --- a/src/init.c
> +++ b/src/init.c
> @@ -1388,18 +1388,11 @@ cmd_time (const char *com, const char *val, void 
> *place)
>  static bool
>  cmd_use_askpass (const char *com _GL_UNUSED, const char *val, void *place)
>  {
> -  char *env_name = "WGET_ASKPASS";
> -  char *env;
> +  const char *env_name = "WGET_ASKPASS";
> +  const char *env;
>  
>    if (val && *val)
> -    {
> -      if (!file_exists_p (val))
> -        {
> -          fprintf (stderr, _("%s does not exist.\n"), val);
> -          exit (WGET_EXIT_GENERIC_ERROR);
> -        }
> -      return cmd_string (com, val, place);
> -    }
> +    return cmd_string (com, val, place);
>  
>    env = getenv (env_name);
>    if (!(env && *env))
> @@ -1414,13 +1407,6 @@ cmd_use_askpass (const char *com _GL_UNUSED, const 
> char *val, void *place)
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
>  
> -  if (!file_exists_p (env))
> -    {
> -      fprintf (stderr, _("%s points to %s, which does not exist.\n"),
> -              env_name, env);
> -      exit (WGET_EXIT_GENERIC_ERROR);
> -    }
> -
>    return cmd_string (com, env, place);
>  }
>  
> diff --git a/src/main.c b/src/main.c
> index 749ec3c..9d0d5d3 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -61,6 +61,7 @@ as that of the covered work.  */
>  #include "version.h"
>  #include "c-strcase.h"
>  #include "dirname.h"
> +#include "xmemdup0.h"
>  #include <getopt.h>
>  #include <getpass.h>
>  #include <quote.h>
> @@ -1038,7 +1039,7 @@ prompt_for_password (void)
>  
>  
>  /* Execute external application opt.use_askpass */
> -void
> +static void
>  run_use_askpass (char *question, char **answer)
>  {
>    char tmp[1024];
> @@ -1046,12 +1047,12 @@ run_use_askpass (char *question, char **answer)
>    int status;
>    int com[2];
>    ssize_t bytes = 0;
> -  char * const argv[] = { opt.use_askpass, question, NULL };
> +  char *argv[3], *p;
>    posix_spawn_file_actions_t fa;
>  
>    if (pipe (com) == -1)
>      {
> -      fprintf (stderr, _("Cannot create pipe"));
> +      fprintf (stderr, _("Cannot create pipe\n"));
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
>  
> @@ -1059,7 +1060,7 @@ run_use_askpass (char *question, char **answer)
>    if (status)
>      {
>        fprintf (stderr,
> -              _("Error initializing spawn file actions for use-askpass: %d"),
> +              _("Error initializing spawn file actions for use-askpass: 
> %d\n"),
>                status);
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
> @@ -1068,15 +1069,21 @@ run_use_askpass (char *question, char **answer)
>    if (status)
>      {
>        fprintf (stderr,
> -              _("Error setting spawn file actions for use-askpass: %d"),
> +              _("Error setting spawn file actions for use-askpass: %d\n"),
>                status);
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
>  
> +  /* C89 initializer lists must be computable at load time,
> +   * thus this explicit initialization. */
> +  argv[0] = opt.use_askpass;
> +  argv[1] = question;
> +  argv[2] = NULL;
> +
>    status = posix_spawnp (&pid, opt.use_askpass, &fa, NULL, argv, environ);
>    if (status)
>      {
> -      fprintf (stderr, "Error spawning %s: %d", opt.use_askpass, status);
> +      fprintf (stderr, "Error spawning %s: %d\n", opt.use_askpass, status);
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
>  
> @@ -1090,19 +1097,19 @@ run_use_askpass (char *question, char **answer)
>                opt.use_askpass, question, strerror (errno));
>        exit (WGET_EXIT_GENERIC_ERROR);
>      }
> -  /* Set the end byte to \0, and decrement bytes */
> -  tmp[bytes--] = '\0';
> +
> +  /* Make sure there is a trailing 0 */
> +  tmp[bytes] = '\0';
>  
>    /* Remove a possible new line */
> -  while (bytes >= 0 &&
> -        (tmp[bytes] == '\0' || tmp[bytes] == '\n' || tmp[bytes] == '\r'))
> -    tmp[bytes--] = '\0';
> +  if ((p = strpbrk(tmp, "\r\n")))
> +    bytes = p - tmp;
>  
> -  *answer = xmemdup (tmp, bytes + 2);
> +  *answer = xmemdup0 (tmp, bytes);
>  }
>  
>  /* set the user name and password*/
> -void
> +static void
>  use_askpass (struct url *u)
>  {
>    static char question[1024];
> -- 
> 2.9.3
> 






reply via email to

[Prev in Thread] Current Thread [Next in Thread]