Andy Wingo <wi...@pobox.com> skribis: > commit 9a951678713557b548415d32eae6d63d039bf652 > Author: Andy Wingo <wi...@pobox.com> > 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’.