Package: fakeroot
Version: 1.32.2-1+b1
Severity: important
Tags: patch upstream

Hello,

I couldn't find the upstream for fakeroot, so reporting here.

I was getting testsuite issues on hurd-amd64, the t.tar test would fail: 

13c13
< rw-r--r-- root/root 0 tar/1.file
---
> rw-r--r-- daemon/sys 0 tar/1.file
18c18
< rw-r--r-- root/root 0 tar/3.file
---
> rw-r--r-- daemon/sys 0 tar/3.file
20c20
< rw-r--r-- root/root 0 tar/5.file
---
> rw-r--r-- daemon/sys 0 tar/5.file
24c24
< rw-r--r-- root/root 0 tar/fjsdk.file
---
> rw-r--r-- daemon/sys 0 tar/fjsdk.file
35c35
< rw-r--r-- root/root 0 tar/vn.34.654l..file
---
> rw-r--r-- daemon/sys 0 tar/vn.34.654l..file

It seems like fakeroot is not catching file removals and the inode cache
gets confused. Indeed coreutils now uses renameat2, which fakeroot
doesn't divert yet. The attach patch implements that and indeed fixes
the test.

Samuel

-- System Information:
Debian Release: trixie/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'unreleased'), 
(500, 'testing-debug'), (500, 'stable-security'), (500, 'stable-debug'), (500, 
'oldstable-proposed-updates-debug'), (500, 'oldstable-proposed-updates'), (500, 
'oldoldstable-proposed-updates'), (500, 'oldoldstable'), (500, 
'buildd-unstable'), (500, 'unstable'), (500, 'stable'), (500, 'oldstable'), (1, 
'experimental-debug'), (1, 'buildd-experimental'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386, arm64

Kernel: Linux 6.7.0 (SMP w/8 CPU threads; PREEMPT)
Kernel taint flags: TAINT_WARN, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages fakeroot depends on:
ii  libc6        2.37-13
ii  libfakeroot  1.32.2-1+b1

fakeroot recommends no packages.

fakeroot suggests no packages.

-- no debconf information
Index: fakeroot-1.32.2/config.h.in
===================================================================
--- fakeroot-1.32.2.orig/config.h.in
+++ fakeroot-1.32.2/config.h.in
@@ -144,6 +144,9 @@
 /* Define to 1 if you have the `renameat' function. */
 #undef HAVE_RENAMEAT
 
+/* Define to 1 if you have the `renameat2' function. */
+#undef HAVE_RENAMEAT2
+
 /* have the semun union */
 #undef HAVE_SEMUN_DEF
 
Index: fakeroot-1.32.2/configure.ac
===================================================================
--- fakeroot-1.32.2.orig/configure.ac
+++ fakeroot-1.32.2/configure.ac
@@ -360,7 +360,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   ],[ AC_MSG_RESULT([no])
   ])
 
-AC_CHECK_FUNCS(fchmodat fchownat fstatat mkdirat mknodat openat renameat 
unlinkat lchmod fgetattrlist)
+AC_CHECK_FUNCS(fchmodat fchownat fstatat mkdirat mknodat openat renameat 
renameat2 unlinkat lchmod fgetattrlist)
 
 save_LIBS="$LIBS"
 # Linux
Index: fakeroot-1.32.2/libfakeroot.c
===================================================================
--- fakeroot-1.32.2.orig/libfakeroot.c
+++ fakeroot-1.32.2/libfakeroot.c
@@ -1382,6 +1382,29 @@ int renameat(int olddir_fd, const char *
   return 0;
 }
 #endif /* HAVE_RENAMEAT */
+#ifdef HAVE_RENAMEAT2
+int renameat2(int olddir_fd, const char *oldpath,
+              int newdir_fd, const char *newpath, unsigned int flags){
+  int r,s;
+  INT_STRUCT_STAT st;
+
+  /* If newpath points to an existing file, that file will be
+     unlinked.   Make sure we tell the faked daemon about this! */
+
+  /* we need the st_new struct in order to inform faked about the
+     (possible) unlink of the file */
+
+  r=INT_NEXT_FSTATAT(newdir_fd, newpath, &st, AT_SYMLINK_NOFOLLOW);
+
+  s=next_renameat2(olddir_fd, oldpath, newdir_fd, newpath, flags);
+  if(s)
+    return -1;
+  if(!r)
+    INT_SEND_STAT(&st,unlink_func);
+
+  return 0;
+}
+#endif /* HAVE_RENAMEAT2 */
 #endif /* HAVE_FSTATAT */
 
 
Index: fakeroot-1.32.2/wrapfunc.inp
===================================================================
--- fakeroot-1.32.2.orig/wrapfunc.inp
+++ fakeroot-1.32.2/wrapfunc.inp
@@ -203,6 +203,9 @@ mkdirat;int;(int dir_fd, const char *pat
 #ifdef HAVE_RENAMEAT
 renameat;int;(int olddir_fd, const char *oldpath, int newdir_fd, const char 
*newpath);(olddir_fd, oldpath, newdir_fd, newpath)
 #endif /* HAVE_RENAMEAT */
+#ifdef HAVE_RENAMEAT2
+renameat2;int;(int olddir_fd, const char *oldpath, int newdir_fd, const char 
*newpath, unsigned int flags);(olddir_fd, oldpath, newdir_fd, newpath, flags)
+#endif /* HAVE_RENAMEAT2 */
 #ifdef HAVE_UNLINKAT
 unlinkat;int;(int dir_fd, const char *pathname, int flags);(dir_fd, pathname, 
flags)
 #endif /* HAVE_UNLINKAT */

Reply via email to