Control: tags 1001961 patch

Christoph Biedl wrote...

> it seems recent changes in libc6 caused the stat() call in C applications
> to be expanded in a different way, a way fakeroot does not properly
> handle, resulting in the real user-id, not 0.

Fix appended (inline, not a patch) for better readability. Tested
successfully on the following archs: amd64, i386, armel, armhf, arm64;
with both fakeroot(-sysv) and fakeroot-tcp.

Cheers,

    Christoph

Subject: Also wrap the "stat" library call
Author: Christoph Biedl <debian.a...@manchmal.in-ulm.de>
Date: 2021-12-20
Bug-Debian: https://bugs.debian.org/1001961

    Seems changes in glibc 2.33 caused the stat() function to be mapped
    into a stat() library call instead of __xstat() as it used to be.

    However, fakeroot does not wrap this, causing files to be reported
    with the real owner, not 0 as expected.

    The fix for this got more ugly than wished as the abstraction in
    configure.ac would not allow wrapping both "stat" and "__xstat". So
    enhance the search list capabilities with an optional symbol how the
    wrapped function is named internally. Also hack the parser so
    "state" gets actually probed.

    Using "realstat" is not the best choice as it might be confusing,
    but "statstat" seemed even worse.

--- a/configure.ac
+++ b/configure.ac
@@ -353,9 +353,13 @@
 
 :>fakerootconfig.h.tmp
 
-for SEARCH in %stat f%stat l%stat f%statat %stat64 f%stat64 l%stat64 
f%statat64 %mknod %mknodat; do
-  FUNC=`echo $SEARCH|sed -e 's/.*%//'`
+for SEARCH in %stat s%tat@realstat f%stat l%stat f%statat %stat64 f%stat64 
l%stat64 f%statat64 %mknod %mknodat; do
+  FUNC=`echo $SEARCH|sed -e 's/.*%// ; s/@.*//'`
   PRE=`echo $SEARCH|sed -e 's/%.*//'`
+  PF_PRE=`echo $SEARCH|sed -e 's/.*@//'`
+  if test "$PF_PRE" = "$SEARCH" ; then
+    PF_PRE="${PRE}${FUNC}"
+  fi
   FOUND=
   for WRAPPED in __${PRE}x${FUNC} _${PRE}x${FUNC} __${PRE}${FUNC}13 
${PRE}${FUNC}; do
     AC_CHECK_FUNCS($WRAPPED,FOUND=$WRAPPED)
@@ -366,8 +370,8 @@
 dnl  for WRAPPED in _${PRE}${FUNC}; do
 dnl    FOUND=$WRAPPED
     if test -n "$FOUND"; then
-      PF=[`echo ${PRE}${FUNC}| tr '[a-z]' '[A-Z]'`]
-      DEFINE_WRAP=[`echo wrap_${PRE}${FUNC}| tr '[a-z]' '[A-Z]'`]
+      PF=[`echo $PF_PRE | tr '[a-z]' '[A-Z]'`]
+      DEFINE_WRAP=[`echo wrap_${PF_PRE}| tr '[a-z]' '[A-Z]'`]
       DEFINE_NEXT=[`echo wrap_${FOUND}| tr '[a-z]' '[A-Z]'`]
       DEFINE_ARG=[`echo wrap_${FOUND}| tr '[a-z]' '[A-Z]'`]
       AC_DEFINE_UNQUOTED(WRAP_${PF}, $FOUND)
@@ -509,6 +513,12 @@
 #define TMP_STAT  __astat
 #define NEXT_STAT_NOARG  next___astat
 
+#define WRAP_REALSTAT  __astat
+#define WRAP_REALSTAT_QUOTE  __astat
+#define WRAP_REALSTAT_RAW  __astat
+#define TMP_REALSTAT  __astat
+#define NEXT_REALSTAT_NOARG  next___astat
+
 #define WRAP_LSTAT_QUOTE  __astat
 #define WRAP_LSTAT  __astat
 #define WRAP_LSTAT_RAW  __astat

Attachment: signature.asc
Description: PGP signature

Reply via email to