Re: Texinfo 7.2.90 build with mingw.org's MinGW: testing [info]

Gavin Smith <[email protected]>
Newsgroups gmane.comp.tex.texinfo.bugs
Message-ID <aW_wB8yfJNYF2Bnu@orangestar>
On Fri, Jan 16, 2026 at 06:03:04PM +0200, Eli Zaretskii wrote:
> In addition, the !PIPE_USE_FORK branch of get_output_from_program had
> a few problems: it failed to use the FILENAME argument when
> constructing the command line for popen, used the null
> formatter_args[2] in sprintf, and had a few other minor issues.
> 
> Here's the patch to fix all that, after which all Info tests pass.  I
> will see about writing a Windows batch file that works like
> info/info-hooks-default/manual-not-found, so that "make install" could
> install it.

I've committed this, except for moving one line: "free (cmdline);".
This moved the 'free' after a possible return statement ("return 127;"),
which would be a memory leak if that return statement were run.

Please let me know if there is a problem with running "free" on
the argument to "popen" before calling "pclose".

> --- info/run-external.c~0	2026-01-01 20:44:32.000000000 +0200
> +++ info/run-external.c	2026-01-16 17:40:33.599793200 +0200
> @@ -88,12 +88,21 @@ get_output_from_program (char *filename,
>    {
>      FILE *fpipe;
>      char *cmdline;
> -    size_t cmdlen = 0;
>      int save_stderr = dup (fileno (stderr));
>      int fd_err = open (NULL_DEVICE, O_WRONLY, 0666);
> +    size_t cmdlen = strlen (filename);
>      int i;
>  
> -    for (i = 0; formatter_args[i]; i++)
> +#ifdef __MINGW32__
> +    /* Mirror all forward slashes in FILENAME to backslashes, since
> +       otherwise the Windows shell might fail to run the script.  */
> +    filename = xstrdup (filename);
> +    for (i = 0; i < cmdlen; i++)
> +      if (filename[i] == '/')
> +	filename[i] = '\\';
> +#endif
> +
> +    for (i = 1; formatter_args[i]; i++)
>        cmdlen += strlen (formatter_args[i]);
>      /* Add-ons: 2 blanks, 2 quotes for the formatter program, 1
>         terminating null character.  */
> @@ -102,10 +111,12 @@ get_output_from_program (char *filename,
>  
>      if (fd_err > 2)
>        dup2 (fd_err, fileno (stderr)); /* Don't print errors. */
> -    sprintf (cmdline, "\"%s\" %s %s",
> -             formatter_args[0], formatter_args[1], formatter_args[2]);
> +    sprintf (cmdline, "\"%s\" %s %s", filename,
> +	     formatter_args[1], formatter_args[2] ? formatter_args[2] : "");
> +#ifdef __MINGW32__
> +    free (filename);
> +#endif
>      fpipe = popen (cmdline, "r");
> -    free (cmdline);
>      if (fd_err > 2)
>        close (fd_err);
>      dup2 (save_stderr, fileno (stderr));
> @@ -113,6 +124,7 @@ get_output_from_program (char *filename,
>        return 127;
>      output = read_from_fd (fileno (fpipe));
>      int pclose_status = pclose (fpipe);
> +    free (cmdline);
>      if (pclose_status != -1)
>        exit_status = pclose_status;
>      else
> --- /dev/null	1970-01-01 02:00:00.000000000 +0200
> +++ info/t/config/texinfo/info-hooks/manual-not-found.cmd	2026-01-16 17:34:37.235683500 +0200
> @@ -0,0 +1,2 @@
> +@echo off
> +exit 1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.