]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
avoid malfunction when virFileResolveLink is applied to non-POSIX FS
authorJim Meyering <meyering@redhat.com>
Tue, 15 Dec 2009 07:27:53 +0000 (08:27 +0100)
committerJim Meyering <meyering@redhat.com>
Tue, 15 Dec 2009 16:46:04 +0000 (17:46 +0100)
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.

bootstrap
configure.in
src/util/util.c

index 667af4fc8b73d988c5721e0a19a2f518ff443fb4..c07d85158e1f1cf24cc68e379d3ac0f772212a09 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -65,6 +65,7 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
 <$gnulib_tool || exit
 
 modules='
+areadlink
 base64
 c-ctype
 close
index 6135932c8f680445518e19de553d556d319c87b3..6ed2efde58529222f5471f1458b8876797097322 100644 (file)
@@ -83,7 +83,7 @@ dnl Use --disable-largefile if you don't want this.
 AC_SYS_LARGEFILE
 
 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
 AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
index 694838a81662130add690342bc6ac7e4ea8b6486..44a4b2fffb453530cd3b68a967b6b73ac6e83d8a 100644 (file)
@@ -64,6 +64,7 @@
 #include <mntent.h>
 #endif
 
+#include "areadlink.h"
 #include "virterror_internal.h"
 #include "logging.h"
 #include "event.h"
@@ -1059,10 +1060,7 @@ int virFileLinkPointsTo(const char *checkLink,
 int virFileResolveLink(const char *linkpath,
                        char **resultpath)
 {
-#ifdef HAVE_READLINK
     struct stat st;
-    char *buf;
-    int n;
 
     *resultpath = NULL;
 
@@ -1075,28 +1073,9 @@ int virFileResolveLink(const char *linkpath,
         return 0;
     }
 
-    /* Posix says that 'st_size' field from
-     * 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 = areadlink (linkpath);
 
-    *resultpath = buf;
-    return 0;
-#else
-    if (!(*resultpath = strdup(linkpath)))
-        return -ENOMEM;
-    return 0;
-#endif
+    return *resultpath == NULL ? -1 : 0;
 }
 
 /*