提交 5baa4635 编写于 作者: J Jim Meyering

avoid malfunction when virFileResolveLink is applied to non-POSIX FS

The virFileResolveLink utility function relied on the POSIX guarantee
that stat.st_size of a symlink is the length of the value.  However,
on some types of file systems, it is invalid, so do not rely on it.
Use gnulib's areadlink module instead.
* bootstrap (modules): Add areadlink.
* src/util/util.c: Include "areadlink.h".
Let areadlink perform the readlink and malloc.
* configure.in (AC_CHECK_FUNCS): Remove readlink.  No need,
since it's presence is guaranteed by gnulib.
上级 f3cbd24d
...@@ -65,6 +65,7 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool ...@@ -65,6 +65,7 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
<$gnulib_tool || exit <$gnulib_tool || exit
modules=' modules='
areadlink
base64 base64
c-ctype c-ctype
close close
......
...@@ -83,7 +83,7 @@ dnl Use --disable-largefile if you don't want this. ...@@ -83,7 +83,7 @@ dnl Use --disable-largefile if you don't want this.
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
dnl Availability of various common functions (non-fatal if missing). dnl Availability of various common functions (non-fatal if missing).
AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap readlink]) AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap])
dnl Availability of various not common threadsafe functions dnl Availability of various not common threadsafe functions
AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r]) AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
......
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
#include <mntent.h> #include <mntent.h>
#endif #endif
#include "areadlink.h"
#include "virterror_internal.h" #include "virterror_internal.h"
#include "logging.h" #include "logging.h"
#include "event.h" #include "event.h"
...@@ -1059,10 +1060,7 @@ int virFileLinkPointsTo(const char *checkLink, ...@@ -1059,10 +1060,7 @@ int virFileLinkPointsTo(const char *checkLink,
int virFileResolveLink(const char *linkpath, int virFileResolveLink(const char *linkpath,
char **resultpath) char **resultpath)
{ {
#ifdef HAVE_READLINK
struct stat st; struct stat st;
char *buf;
int n;
*resultpath = NULL; *resultpath = NULL;
...@@ -1075,28 +1073,9 @@ int virFileResolveLink(const char *linkpath, ...@@ -1075,28 +1073,9 @@ int virFileResolveLink(const char *linkpath,
return 0; return 0;
} }
/* Posix says that 'st_size' field from *resultpath = areadlink (linkpath);
* result of an lstat() call is filled with
* number of bytes in the destination
* filename.
*/
if (VIR_ALLOC_N(buf, st.st_size + 1) < 0)
return -ENOMEM;
if ((n = readlink(linkpath, buf, st.st_size)) < 0) {
VIR_FREE(buf);
return -errno;
}
buf[n] = '\0';
*resultpath = buf; return *resultpath == NULL ? -1 : 0;
return 0;
#else
if (!(*resultpath = strdup(linkpath)))
return -ENOMEM;
return 0;
#endif
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册