Subject: bug#19540: repeated ./././ in compiled modules

From: [email-masked] (Ludovic Courtès)
Date: Thu, 23 Jun 2016 15:06:27 +0200

Andy Wingo <[email-masked]> skribis:

> commit 9a951678713557b548415d32eae6d63d039bf652
> Author: Andy Wingo <[email-masked]>
> Date:   Thu Jun 23 10:03:10 2016 +0200
>
>     Fix relative file name canonicalization on paths with "."
>     
>     * libguile/filesys.c (scm_i_relativize_path): Canonicalize the file
>       names elements that we will be using as prefixes.  Fixes the case
>       where a load path contains a relative file name: #19540.
>     * test-suite/tests/ports.test ("%file-port-name-canonicalization"): Add
>       tests that elements of the load path are canonicalized.
>
> diff --git a/libguile/filesys.c b/libguile/filesys.c
> index 7674498..25501ef 100644
> --- a/libguile/filesys.c
> +++ b/libguile/filesys.c
> @@ -1614,22 +1614,40 @@ SCM_DEFINE (scm_canonicalize_path, "canonicalize-path", 1, 0, 0,
>  SCM
>  scm_i_relativize_path (SCM path, SCM in_path)

[...]

>    for (; scm_is_pair (in_path); in_path = scm_cdr (in_path))
>      {
>        SCM dir = scm_car (in_path);
> -      size_t len = scm_c_string_length (dir);
> +      size_t len;
> +
> +      /* Try to canonicalize DIR, since we have canonicalized PATH.  */
> +      {
> +        char *str, *canon;
> +
> +        str = scm_to_locale_string (dir);
> +        canon = canonicalize_file_name (str);
> +        free (str);
> +  
> +        if (canon)
> +          dir = scm_from_locale_string (canon);
> +        free (canon);
> +      }
> +
> +      len = scm_c_string_length (dir);
>  
>        /* When DIR is empty, it means "current working directory".  We
>  	 could set DIR to (getcwd) in that case, but then the

‘canonicalize_file_name’ is costly: roughly one syscall per file name
component.

IIUC, ‘canonicalize_file_name’ is now called once for each ‘%load-path’
entry and file name that we canonicalize.  Is this correct?

Ludo’.