Re: Can we avoid chdir'ing in resolve_symlinks() ?

From: Andrew Dunstan <andrew(at)dunslane(dot)net>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Can we avoid chdir'ing in resolve_symlinks() ?
Date: 2022-09-03 15:06:54
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

On 2022-09-01 Th 19:39, Tom Lane wrote:
> find_my_exec() wants to obtain an absolute, symlink-free path
> to the program's own executable, for what seem to me good
> reasons. However, chasing down symlinks is left to its
> subroutine resolve_symlinks(), which does this:
> * To resolve a symlink properly, we have to chdir into its directory and
> * then chdir to where the symlink points; otherwise we may fail to
> * resolve relative links correctly (consider cases involving mount
> * points, for example). After following the final symlink, we use
> * getcwd() to figure out where the heck we're at.
> and then afterwards it has to chdir back to the original cwd.
> That last step is a bit of a sore spot, because sometimes
> (especially in sudo situations) we may not have the privileges
> necessary to do that; I think this is the cause of the complaint
> at [1]. Anyway the whole thing seems a bit excessively Rube
> Goldbergian. I'm wondering why we couldn't just read the
> symlink(s), concatenate them together, and use canonicalize_path()
> to clean up any mess.
> This code was mine originally (336969e49), but I sure don't
> remember why I wrote it like that. I know we didn't have a
> robust version of canonicalize_path() then, and that may have
> been the main issue, but that offhand comment about mount
> points bothers me. But I can't reconstruct precisely what
> I was worried about there. The only contemporaneous discussion
> thread I can find is [2], which doesn't go into coding details.
> Thoughts?
> regards, tom lane
> [1]
> [2]

These days there seem to be library functions that do this, realpath(3)
and canonicalize_file_name(3). The latter is what seems to be called by
readlink(1). Should we be using one of those? I don't know how portable
they are. I don't see them here :-(



Andrew Dunstan

In response to


Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2022-09-03 15:11:29 pg_basebackup's --gzip switch misbehaves
Previous Message Julien Rouhaud 2022-09-03 15:00:51 Re: Schema variables - new implementation for Postgres 15