tags 561991 + patch
thanks

The attached patch should resolve debian bug 561991 by aligning the
value stored by fakechrooted lstat() in buf.st_size with the length
returned by the fakechroot'ed readlink().
This is the resolution option i numbered as "1" in my previous e-mail.

hope this helps,

        --dkg
commit c4dda5ab637a9d9b38f1b9c09b5d23cb07a8a7f7
Author: Daniel Kahn Gillmor <d...@fifthhorseman.net>
Date:   Thu May 20 22:24:57 2010 -0400

    aligning st_size in lstat() calls with size ultimately returned by fakechrooted readlink

diff --git a/src/libfakechroot.c b/src/libfakechroot.c
index 427dfde..1a6c93c 100644
--- a/src/libfakechroot.c
+++ b/src/libfakechroot.c
@@ -896,10 +896,19 @@ int __fxstatat64 (int ver, int dirfd, const char *pathname, struct stat64 *buf,
 /* #include <unistd.h> */
 int __lxstat (int ver, const char *filename, struct stat *buf)
 {
-    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH];
+    int retval;
+    READLINK_TYPE_RETURN status;
+    const char* orig;
+    orig = filename;
     expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf);
     if (next___lxstat == NULL) fakechroot_init();
-    return next___lxstat(ver, filename, buf);
+    retval = next___lxstat(ver, filename, buf);
+    /* deal with http://bugs.debian.org/561991 */
+    if ((buf->st_mode & S_IFMT) == S_IFLNK)
+      if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1)
+        buf->st_size = status;
+    return retval;
 }
 #endif
 
@@ -909,10 +918,19 @@ int __lxstat (int ver, const char *filename, struct stat *buf)
 /* #include <unistd.h> */
 int __lxstat64 (int ver, const char *filename, struct stat64 *buf)
 {
-    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH];
+    int retval;
+    READLINK_TYPE_RETURN status;
+    const char* orig;
+    orig = filename;
     expand_chroot_path(filename, fakechroot_path, fakechroot_ptr, fakechroot_buf);
     if (next___lxstat64 == NULL) fakechroot_init();
-    return next___lxstat64(ver, filename, buf);
+    retval = next___lxstat64(ver, filename, buf);
+    /* deal with http://bugs.debian.org/561991 */
+    if ((buf->st_mode & S_IFMT) == S_IFLNK)
+      if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1)
+        buf->st_size = status;
+    return retval;
 }
 #endif
 
@@ -2203,10 +2221,19 @@ int lsetxattr (const char *path, const char *name, const void *value, size_t siz
 /* #include <unistd.h> */
 int lstat (const char *file_name, struct stat *buf)
 {
-    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH];
+    int retval;
+    READLINK_TYPE_RETURN status;
+    const char* orig;
+    orig = file_name;
     expand_chroot_path(file_name, fakechroot_path, fakechroot_ptr, fakechroot_buf);
     if (next_lstat == NULL) fakechroot_init();
-    return next_lstat(file_name, buf);
+    retval = next_lstat(file_name, buf);
+    /* deal with http://bugs.debian.org/561991 */
+    if ((buf->st_mode & S_IFMT) == S_IFLNK)
+      if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1)
+        buf->st_size = status;
+    return retval;
 }
 #endif
 
@@ -2217,10 +2244,19 @@ int lstat (const char *file_name, struct stat *buf)
 /* #include <unistd.h> */
 int lstat64 (const char *file_name, struct stat64 *buf)
 {
-    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH];
+    char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_MAXPATH], tmp[FAKECHROOT_MAXPATH];
+    int retval;
+    READLINK_TYPE_RETURN status;
+    const char* orig;
+    orig = file_name;
     expand_chroot_path(file_name, fakechroot_path, fakechroot_ptr, fakechroot_buf);
     if (next_lstat64 == NULL) fakechroot_init();
-    return next_lstat64(file_name, buf);
+    retval = next_lstat64(file_name, buf);
+    /* deal with http://bugs.debian.org/561991 */
+    if ((buf->st_mode & S_IFMT) == S_IFLNK)
+      if ((status = readlink(orig, tmp, sizeof(tmp)-1)) != -1)
+        buf->st_size = status;
+    return retval;
 }
 #endif
 #endif

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to