From: Magnus Hagander Date: Wed, 7 Dec 2011 11:09:05 +0000 (+0100) Subject: Avoid using readlink() on platforms that don't support it X-Git-Tag: REL9_1_3~61 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c32da5caa2efc9bdc7f04ae26488211ff219e8a;p=postgresql Avoid using readlink() on platforms that don't support it We don't have any such platforms now, but might in the future. Also, detect cases when a tablespace symlink points to a path that is longer than we can handle, and give a warning. --- diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index d6ed49a26f..73a7f17149 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -108,6 +108,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) { char fullpath[MAXPGPATH]; char linkpath[MAXPGPATH]; + int rllen; /* Skip special stuff */ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) @@ -115,19 +116,37 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name); - MemSet(linkpath, 0, sizeof(linkpath)); - if (readlink(fullpath, linkpath, sizeof(linkpath) - 1) == -1) +#if defined(HAVE_READLINK) || defined(WIN32) + rllen = readlink(fullpath, linkpath, sizeof(linkpath) - 1); + if (rllen < 0) + { + ereport(WARNING, + (errmsg("could not read symbolic link \"%s\": %m", fullpath))); + continue; + } + else if (rllen >= sizeof(linkpath)) { ereport(WARNING, - (errmsg("could not read symbolic link \"%s\": %m", fullpath))); + (errmsg("symbolic link \"%s\" target is too long", fullpath))); continue; } + linkpath[rllen] = '\0'; ti = palloc(sizeof(tablespaceinfo)); ti->oid = pstrdup(de->d_name); ti->path = pstrdup(linkpath); ti->size = opt->progress ? sendDir(linkpath, strlen(linkpath), true) : -1; tablespaces = lappend(tablespaces, ti); +#else + /* + * If the platform does not have symbolic links, it should not be possible + * to have tablespaces - clearly somebody else created them. Warn about it + * and ignore. + */ + ereport(WARNING, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("tablespaces are not supported on this platform"))); +#endif } /* Add a node for the base directory at the end */