René Scharfe <l....@web.de> writes:

> The value of PATH_MAX is platform-dependent, so it's easy to exceed when
> doing cross-platform development.  It's also not a hard limit on most
> operating systems, not even on Windows.  Further reading:
>
>    https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
>
> So using a fixed buffer is not a good idea, and writing to it without
> checking is dangerous.  Here's a fix:
>
> -- >8 --
> Subject: [PATCH] merge-recursive: use xstrdup() instead of fixed buffer
>
> Paths can be longer than PATH_MAX.  Avoid a buffer overrun in
> check_dir_renamed() by using xstrdup() to make a private copy safely.
>
> Signed-off-by: Rene Scharfe <l....@web.de>
> ---

Thanks.  Makes sense.

>  merge-recursive.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/merge-recursive.c b/merge-recursive.c
> index ac27abbd4c..db708176c5 100644
> --- a/merge-recursive.c
> +++ b/merge-recursive.c
> @@ -2211,18 +2211,18 @@ static struct hashmap *get_directory_renames(struct 
> diff_queue_struct *pairs,
>  static struct dir_rename_entry *check_dir_renamed(const char *path,
>                                                 struct hashmap *dir_renames)
>  {
> -     char temp[PATH_MAX];
> +     char *temp = xstrdup(path);
>       char *end;
> -     struct dir_rename_entry *entry;
> +     struct dir_rename_entry *entry = NULL;;
>  
> -     strcpy(temp, path);
>       while ((end = strrchr(temp, '/'))) {
>               *end = '\0';
>               entry = dir_rename_find_entry(dir_renames, temp);
>               if (entry)
> -                     return entry;
> +                     break;
>       }
> -     return NULL;
> +     free(temp);
> +     return entry;
>  }
>  
>  static void compute_collisions(struct hashmap *collisions,

Reply via email to