[tz] zic fails for soft-links-only target volume

Tom Lane tgl at sss.pgh.pa.us
Thu Nov 3 14:55:54 UTC 2016

I wrote:
> It appears to me that the problem is that commit 35484e98c broke
> the case of linking to an existing symlink.  This happened because
> itsdir() was modified to return 2 not 0 for a symlink, but dolink()
> throws an EPERM error for that, because it wasn't taught about the
> change.  There's no reason to disallow that case, so I propose this
> patch:

On closer inspection, I notice that there really aren't any callers
of itsdir() that are interested in both conditions simultaneously.
So a less error-prone solution would be to revert 35484e98c's changes
to itsdir(), taking it back to doing only what the name suggests,
and invent an itssymlink() function that has a similar API but tests
for symlink-ness not directory-ness.  Then you'd do this:

-	  staysymlink = itsdir(tofield) == 2;
+	  staysymlink = itssymlink(tofield) > 0;

and leave dolink()'s first usage of itsdir() alone.

I also note that 35484e98c has possibly broken the other caller of

		if (mkdir(name, MKDIR_UMASK) != 0) {
			int err = errno;
			if (err != EEXIST && itsdir(name) < 0) {
				error(_("%s: Can't create directory %s: %s"),
				      progname, name, strerror(err));

as I doubt we want that to consider "it's a symlink" as an OK outcome.
I would actually say this should be

-			if (err != EEXIST && itsdir(name) < 0) {
+			if (err != EEXIST || itsdir(name) <= 0) {

as we really don't want the code to keep going unless there is a directory
there.  Maybe even drop the test on what the err code is, and only check

			regards, tom lane

More information about the tz mailing list