Re: UB in compath

Philipp <[email protected]>
Newsgroups gmane.mail.nmh.devel
Message-ID <[email protected]>
Hi

Has anyone time to look at this and maybe commit it?

Philipp

[2026-05-24 13:21] Philipp <[email protected]>
> Hi
>
> I had tried to move some mails to a different folder and noticed that
> refile changed the target directory. The path '@../bla/blub' was changed
> to something like '../blaxzub'  So I checked the code and found strcpy
> in compath (sbr/path.c). This function change a given path ìnplace.
> But using strcpy on overlapping objects is UB.
>
> I tried to write a test, but couldn't reproduce the behaivior with the
> test suite. I'm not sure if this is because the bugs only triggert
> with my full mailbox or because I use a different version of path.c.
>
> But the code still contains UB which sould be fixed. I have written
> a quick and dirty fix with strlen and memmove. It would be better
> to avoid recalculation of the strlen or avoid the inplace manipulation
> of the string.
>
> Philipp
>
> diff /home/satanist/src/nmh
> path + /home/satanist/src/nmh
> commit - 9ce1475266997843ad456da6d2940340f31d9687
> blob - 08de38989c6501c201b28a382b5a37ed143d79ad
> file + sbr/path.c
> --- sbr/path.c
> +++ sbr/path.c
> @@ -143,6 +143,7 @@ static void
>  compath (char *f)
>  {
>      char *cp, *dp;
> +    size_t len;
>  
>      if (*f != '/')
>  	return;
> @@ -162,7 +163,8 @@ compath (char *f)
>              case '/':
>                  for (dp = cp; *dp == '/'; dp++)
>                      continue;
> -                strcpy (cp--, dp);
> +                len = strlen(dp) + 1;
> +                memmove (cp--, dp, len);
>                  continue;
>  
>              case '.':
> @@ -187,12 +189,14 @@ compath (char *f)
>                              break;
>                      if (dp <= f)
>                          dp = f;
> -                    strcpy (dp, cp + LEN(PWD) - 1);
> +                    len = strlen(cp + LEN(PWD) - 1) + 1;
> +                    memmove (dp, cp + LEN(PWD) - 1, len);
>                      cp = dp;
>                      continue;
>                  }
>                  if (has_prefix(cp, CWD)) {
> -                    strcpy (cp - 1, cp + LEN(CWD) - 1);
> +                    len = strlen(cp + LEN(CWD) - 1) + 1;
> +                    memmove (cp - 1, cp + LEN(CWD) - 1, len);
>                      cp--;
>                      continue;
>                  }
>
>
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.