diff options
-rw-r--r-- | src/port/dirmod.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/port/dirmod.c b/src/port/dirmod.c index 398787360a2..d83316d6a2a 100644 --- a/src/port/dirmod.c +++ b/src/port/dirmod.c @@ -363,10 +363,21 @@ pgreadlink(const char *path, char *buf, size_t size) r -= 1; /* - * If the path starts with "\??\", which it will do in most (all?) cases, - * strip those out. + * If the path starts with "\??\" followed by a "drive absolute" path + * (known to Windows APIs as RtlPathTypeDriveAbsolute), then strip that + * prefix. This undoes some of the transformation performed by + * pqsymlink(), to get back to a format that users are used to seeing. We + * don't know how to transform other path types that might be encountered + * outside PGDATA, so we just return them directly. */ - if (r > 4 && strncmp(buf, "\\??\\", 4) == 0) + if (r >= 7 && + buf[0] == '\\' && + buf[1] == '?' && + buf[2] == '?' && + buf[3] == '\\' && + isalpha(buf[4]) && + buf[5] == ':' && + buf[6] == '\\') { memmove(buf, buf + 4, strlen(buf + 4) + 1); r -= 4; |