> As mentioned in the PR, strncat does something different from what the
> code expects (the last argument is the maximum number of characters
> to be copied, rather than maximum number of characters in the destination
> buffer).  As for the (highly unlikely, because d->d_name really should be
> the pid numbers plus a couple of extra dirnames) case of truncated name
> trying to open such truncated filename wouldn't work anyway, this
> patch just skips it altogether if there would be overflow.
> GCC strlen pass should be able to optimize all the 3 calls into memcpy,
> using strlen value from the earlier strlen call.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2017-02-01  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR ada/79309
>       * adaint.c (__gnat_killprocesstree): Don't clear statfile
>       before overwriting it.  If d->d_name is too long, skip trying
>       to construct the filename and open it.  Use strcpy/strcat
>       instead of strncpy/strncat.

Sorry, I installed the fix in the meantime and our messages crossed.

> --- gcc/ada/adaint.c.jj       2017-01-12 22:28:59.293871830 +0100
> +++ gcc/ada/adaint.c  2017-02-01 09:18:47.027598963 +0100
> @@ -3396,14 +3396,16 @@ void __gnat_killprocesstree (int pid, in
>      {
>        if ((d->d_type & DT_DIR) == DT_DIR)
>          {
> -          char statfile[64] = { 0 };
> +       char statfile[64];
>            int _pid, _ppid;
> 
>            /* read /proc/<PID>/stat */
> 
> -          strncpy (statfile, "/proc/", sizeof(statfile));
> -          strncat (statfile, d->d_name, sizeof(statfile));
> -          strncat (statfile, "/stat", sizeof(statfile));
> +       if (strlen (d->d_name) > sizeof (statfile) - sizeof ("/proc//stat"))
> +         continue;

I think you need ">=" here.

-- 
Eric Botcazou

Reply via email to