Your message dated Sat, 28 Mar 2026 19:44:27 -0300
with message-id <[email protected]>
and subject line faketime: fixed in 0.9.12-0.1
has caused the Debian Bug report #1132172,
regarding NMU: update to 0.9.12
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1132172: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1132172
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: faketime
X-Debbugs-Cc: [email protected]
Version: 0.9.10+2024-06-05+gba9ed5b2-0.6
Severity: normal

I have prepared an NMU for faketime.

This upload updates the package to upstream 0.9.12, drops obsolete
Debian patches that are now included upstream, and includes two upstream
cherry-picks for the utimensat(2)/futimens(2) fix and its regression
test. The proposed version is 0.9.12-0.1, and a debdiff is attached.

This NMU is being done under the maintainer's LowThresholdNmu
preference.

I verified that the source package builds successfully, a clean sbuild
on unstable/amd64 succeeds, lintian passes with no issues beyond info
tags, and the smoketest and upstream autopkgtests pass. The
simple-cprogs autopkgtest failed once locally, but it appears to be a
pre-existing 1-second wrapper timing flake, and a CI rerun passed.

I am sending this notice and proceeding with the upload without delay.
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/debian/changelog 
faketime-0.9.12/debian/changelog
--- faketime-0.9.10+2024-06-05+gba9ed5b2/debian/changelog       2025-01-27 
08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/changelog    2026-03-28 13:53:05.000000000 -0400
@@ -1,3 +1,14 @@
+faketime (0.9.12-0.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * New upstream version 0.9.12
+  * Add salsa-ci.yml
+  * d/patches:
+    - Remove outdated patches.
+    - Add upstream fix for utimens now handling
+
+ -- Aquila Macedo Costa <[email protected]>  Sat, 28 Mar 2026 13:53:05 
-0400
+
 faketime (0.9.10+2024-06-05+gba9ed5b2-0.6) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0002-Fix-interposition-of-clock_gettime64.patch
 faketime-0.9.12/debian/patches/0002-Fix-interposition-of-clock_gettime64.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0002-Fix-interposition-of-clock_gettime64.patch
 2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0002-Fix-interposition-of-clock_gettime64.patch  
    1969-12-31 19:00:00.000000000 -0500
@@ -1,57 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Fri, 17 Jan 2025 12:05:09 +0000
-Subject: Fix interposition of clock_gettime64
-
-timespec.tv_nsec is 32-bit, even though timeval.tv_usec is
-64-bit (weirdly).  This doesn't matter very much in practice because
- * on little endian architectures (which is all our 32-bit release
-   arches) writing to a too big integer ends up writing the
-   desired value in the desired location, and
- * it doesn't affect the overall struct size on any of our actual
-   architectures (which align the uint64_t to 8 so must make the
-   whole struct 16 not 12), so the write overflow is harmless.
-
-> #include <time.h>
-> #include <sys/time.h>
-> #include <stdio.h>
-> struct timeval tv;
-> struct timespec ts;
-> int main(void) {
->    printf("time_t %lld\n", (unsigned long long) sizeof(time_t));
->    printf("timeval %lld %lld %lld\n",
->           (unsigned long long) sizeof(tv),
->           (unsigned long long) sizeof(tv.tv_sec),
->           (unsigned long long) sizeof(tv.tv_usec)
->           );
->    printf("timespec %lld %lld %lld\n",
->           (unsigned long long) sizeof(ts),
->           (unsigned long long) sizeof(ts.tv_sec),
->           (unsigned long long) sizeof(ts.tv_nsec)
->           );
-> }
-> (sid_armhf-dchroot)iwj@amdahl:~/Faketime/test$ gcc t.c
-> (sid_armhf-dchroot)iwj@amdahl:~/Faketime/test$ ./a.out
-> time_t 8
-> timeval 16 8 8
-> timespec 16 8 4
-> (sid_armhf-dchroot)iwj@amdahl:~/Faketime/test$
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/487
----
- src/libfaketime.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index cb37bcf..d93bfa1 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -168,7 +168,7 @@ struct utimbuf {
- struct __timespec64
- {
-   uint64_t tv_sec;         /* Seconds */
--  uint64_t tv_nsec;        /* Nanoseconds */
-+  uint32_t tv_nsec;        /* this is 32-bit, apparently! */
- };
- 
- /*
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0003-Interpose-__time64.patch
 faketime-0.9.12/debian/patches/0003-Interpose-__time64.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0003-Interpose-__time64.patch
   2025-01-27 08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/patches/0003-Interpose-__time64.patch        
1969-12-31 19:00:00.000000000 -0500
@@ -1,42 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Fri, 17 Jan 2025 09:03:21 +0000
-Subject: Interpose __time64
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/487
----
- src/libfaketime.c | 21 +++++++++++++++++++++
- 1 file changed, 21 insertions(+)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index d93bfa1..aa78c33 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -2437,6 +2437,27 @@ int __clock_gettime64(clockid_t clk_id, struct 
__timespec64 *tp64)
-   return result;
- }
- 
-+/* this is used by 32-bit architectures only */
-+uint64_t __time64(uint64_t *write_out)
-+{
-+  struct timespec tp;
-+  uint64_t output;
-+  int error;
-+
-+  error = clock_gettime(CLOCK_REALTIME, &tp);
-+  if (error == -1)
-+  {
-+    return (uint64_t)error;
-+  }
-+  output = tp.tv_sec;
-+
-+  if (write_out)
-+  {
-+    *write_out = output;
-+  }
-+  return output;
-+}
-+
- #ifdef TIME_UTC
- #ifdef MACOS_DYLD_INTERPOSE
- int macos_timespec_get(struct timespec *ts, int base)
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0004-Interpose-gettimeofday64.patch
 faketime-0.9.12/debian/patches/0004-Interpose-gettimeofday64.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0004-Interpose-gettimeofday64.patch
     2025-01-27 08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/patches/0004-Interpose-gettimeofday64.patch  
1969-12-31 19:00:00.000000000 -0500
@@ -1,47 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Fri, 17 Jan 2025 12:08:23 +0000
-Subject: Interpose gettimeofday64
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/487
----
- src/libfaketime.c | 19 +++++++++++++++++++
- 1 file changed, 19 insertions(+)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index aa78c33..2123d83 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -171,6 +171,13 @@ struct __timespec64
-   uint32_t tv_nsec;        /* this is 32-bit, apparently! */
- };
- 
-+/* __timespec64 is needed for clock_gettime64 on 32-bit architectures */
-+struct __timeval64
-+{
-+  uint64_t tv_sec;         /* Seconds */
-+  uint64_t tv_usec;        /* this is 64-bit, apparently! */
-+};
-+
- /*
-  * Per thread variable, which we turn on inside real_* calls to avoid 
modifying
-  * time multiple times of for the whole process to prevent faking time
-@@ -2437,6 +2444,18 @@ int __clock_gettime64(clockid_t clk_id, struct 
__timespec64 *tp64)
-   return result;
- }
- 
-+/* this is used by 32-bit architectures only */
-+int __gettimeofday64(struct __timeval64 *tv64, void *tz)
-+{
-+  struct timeval tv;
-+  int result;
-+
-+  result = gettimeofday(&tv, tz);
-+  tv64->tv_sec = tv.tv_sec;
-+  tv64->tv_usec = tv.tv_usec;
-+  return result;
-+}
-+
- /* this is used by 32-bit architectures only */
- uint64_t __time64(uint64_t *write_out)
- {
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0005-Re-disable-faking-utime-by-default.patch
 faketime-0.9.12/debian/patches/0005-Re-disable-faking-utime-by-default.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0005-Re-disable-faking-utime-by-default.patch
   2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0005-Re-disable-faking-utime-by-default.patch    
    1969-12-31 19:00:00.000000000 -0500
@@ -1,30 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Sun, 19 Jan 2025 22:17:08 +0000
-Subject: Re-disable faking utime by default
-
-Fixes
-  https://github.com/wolfcw/libfaketime/issues/483
-
-See also
-  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1093412#35
-Hopefully this will fix Debian #1093412.
-
-This patch is now upstream MR
-  https://github.com/wolfcw/libfaketime/pull/486
----
- src/libfaketime.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index 2123d83..c0e793a 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -891,7 +891,7 @@ static bool load_time(struct timespec *tp)
-  *      
=======================================================================
-  */
- #ifdef FAKE_UTIME
--static int fake_utime_disabled = 0;
-+static int fake_utime_disabled = 1;
- #endif
- 
- 
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0006-Replace-data-race-with-use-of-pthread_once-ftpl_init.patch
 
faketime-0.9.12/debian/patches/0006-Replace-data-race-with-use-of-pthread_once-ftpl_init.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0006-Replace-data-race-with-use-of-pthread_once-ftpl_init.patch
 2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0006-Replace-data-race-with-use-of-pthread_once-ftpl_init.patch
      1969-12-31 19:00:00.000000000 -0500
@@ -1,70 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Tue, 21 Jan 2025 18:44:42 +0000
-Subject: Replace data race with use of pthread_once (ftpl_init)
-
-At the cost of no longer nicely detecting recursive initialisation
-problems.
-
-Closes: #1093599
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/488
----
- src/libfaketime.c | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index c0e793a..0cbdbf9 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -319,7 +319,7 @@ static bool check_missing_real(const char *name, bool 
missing)
- #define CHECK_MISSING_REAL(name) \
-   check_missing_real(#name, (NULL == real_##name))
- 
--static int initialized = 0;
-+static pthread_once_t initialized_once_control = PTHREAD_ONCE_INIT;
- 
- /* prototypes */
- static int    fake_gettimeofday(struct timeval *tv);
-@@ -2361,6 +2361,13 @@ int clock_gettime(clockid_t clk_id, struct timespec *tp)
- #endif
- {
-   int result;
-+  ftpl_init();
-+  // If ftpl_init ends up recursing, pthread_once will deadlock.
-+  // So the remaining recursion code is now unreachable.
-+  // Hopefully this doesn't happen in practice.
-+
-+/*
-+
-   static int recursion_depth = 0;
- 
-   if (!initialized)
-@@ -2399,6 +2406,7 @@ int clock_gettime(clockid_t clk_id, struct timespec *tp)
- #endif
-     recursion_depth--;
-   }
-+ */
-   /* sanity check */
-   if (tp == NULL)
-   {
-@@ -2859,7 +2867,6 @@ static void ftpl_really_init(void)
- 
- #undef dlsym
- #undef dlvsym
--  initialized = 1;
- 
- #ifdef FAKE_STATELESS
-   if (0) ft_shm_init();
-@@ -3110,10 +3117,7 @@ static void ftpl_really_init(void)
- }
- 
- inline static void ftpl_init(void) {
--  if (!initialized)
--  {
--    ftpl_really_init();
--  }
-+  pthread_once(&initialized_once_control, ftpl_really_init);
- }
- 
- void *ft_dlvsym(void *handle, const char *symbol, const char *version,
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0007-Replace-data-race-with-use-of-pthread_once-ft_shm_in.patch
 
faketime-0.9.12/debian/patches/0007-Replace-data-race-with-use-of-pthread_once-ft_shm_in.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0007-Replace-data-race-with-use-of-pthread_once-ft_shm_in.patch
 2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0007-Replace-data-race-with-use-of-pthread_once-ft_shm_in.patch
      1969-12-31 19:00:00.000000000 -0500
@@ -1,48 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Tue, 21 Jan 2025 18:50:07 +0000
-Subject: Replace data race with use of pthread_once (ft_shm_init)
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/488
----
- src/libfaketime.c | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index 0cbdbf9..611f4db 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -536,16 +536,20 @@ static void ft_shm_destroy(void)
-   }
- }
- 
-+static pthread_once_t ft_shm_initialized_once_control = PTHREAD_ONCE_INIT;
-+
-+static void ft_shm_really_init (void);
- static void ft_shm_init (void)
-+{
-+  pthread_once(&ft_shm_initialized_once_control, ft_shm_really_init);
-+}
-+
-+static void ft_shm_really_init (void)
- {
-   int ticks_shm_fd;
-   char sem_name[256], shm_name[256], *ft_shared_env = 
getenv("FAKETIME_SHARED");
-   sem_t *shared_semR = NULL;
-   static int nt=1;
--  static int ft_shm_initialized = 0;
--
--  /* do all of this once only */
--  if (ft_shm_initialized > 0) return;
- 
-   /* create semaphore and shared memory locally unless it has been passed 
along */
-   if (ft_shared_env == NULL)
-@@ -625,8 +629,6 @@ static void ft_shm_init (void)
-   { /* force the deletion of the shm sync env variable */
-     unsetenv("FAKETIME_SHARED");
-   }
--
--  ft_shm_initialized = 1;
- }
- 
- static void ft_cleanup (void)
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0008-Call-ftpl_init-before-using-monotonic_conds_lock.patch
 
faketime-0.9.12/debian/patches/0008-Call-ftpl_init-before-using-monotonic_conds_lock.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0008-Call-ftpl_init-before-using-monotonic_conds_lock.patch
     2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0008-Call-ftpl_init-before-using-monotonic_conds_lock.patch
  1969-12-31 19:00:00.000000000 -0500
@@ -1,39 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Wed, 22 Jan 2025 09:11:46 +0000
-Subject: Call ftpl_init before using monotonic_conds_lock
-
-Otherwise we can use this in an uninitialised state, which is not
-allowed.
-
-We call ftpl_init in pthread_cond_init_232, but the application might
-not have called that.  For example, it might have a static condition
-variable set up with PTHREAD_COND_INITIALIZER.
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/488
----
- src/libfaketime.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index 611f4db..cc3a5b5 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -3809,6 +3809,8 @@ int pthread_cond_destroy_232(pthread_cond_t *cond)
- {
-   struct pthread_cond_monotonic* e;
- 
-+  ftpl_init();
-+
-   if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) {
-     sched_yield();
-     return EBUSY;
-@@ -3891,6 +3893,8 @@ int pthread_cond_timedwait_common(pthread_cond_t *cond, 
pthread_mutex_t *mutex,
-   clockid_t clk_id;
-   int result = 0;
- 
-+  ftpl_init();
-+
-   if (abstime != NULL)
-   {
-     if (pthread_rwlock_tryrdlock(&monotonic_conds_lock) != 0) {
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0009-Don-t-use-_try_-locking-calls-for-monotonic_conds_lo.patch
 
faketime-0.9.12/debian/patches/0009-Don-t-use-_try_-locking-calls-for-monotonic_conds_lo.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0009-Don-t-use-_try_-locking-calls-for-monotonic_conds_lo.patch
 2025-01-27 08:14:40.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/0009-Don-t-use-_try_-locking-calls-for-monotonic_conds_lo.patch
      1969-12-31 19:00:00.000000000 -0500
@@ -1,82 +0,0 @@
-From: Ian Jackson <[email protected]>
-Date: Wed, 22 Jan 2025 09:29:58 +0000
-Subject: Don't use _try_ locking calls for monotonic_conds_lock
-
-This reverts commit 8ef74e33b636a53a757a945d8ebc51d0986f0d81
-   "Swapped out pthread_rwlock_xxlock() ..."
-
-This could result in concurrent uses of pthread_cond_* erroneously
-returning EAGAIN, which is not permitted by the spec and which the
-application way well treat as a bug.  This seems to be happening in
-gem2deb in ci.Debian.net.
-
-The commit message in 8ef74e33b636 says (rewrapped)
-
-    Swapped out pthread_rwlock_xxlock(), which doesn't return if it
-    can't obtain the lock, with pthread_rwlock_xxtrylock() followed by
-    sched yield and error code return. The issue is sometimes a thread
-    calling pthread_cond_init() or pthread_cond_destroy() can't
-    acquire the lock when another thread is waiting on a condition
-    variable notification via pthread_cond_timedwait(), and thus the
-    thread calling pthread_cond_init() or pthread_cond_destroy() end
-    up hanging indefinitely.
-
-I don't think this is true.  The things that are done with
-monotonic_conds_lock held are HASH_ADD_PTR HASH_FIND_PTR etc. on
-monotonic_conds, which should all be fast and AFAICT don't in turn
-take any locks.  So it shouldn't deadlock.
-
-I conjecture that the underlying bug being experienced by the author
-of "Swapped out pthread_rwlock_xxlock" was the lack of ftpl_init - ie,
-access to an uninitialised pthread_rwlock_t.  That might result in a
-hang.
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/488
----
- src/libfaketime.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index cc3a5b5..e03dec7 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -3794,9 +3794,9 @@ int pthread_cond_init_232(pthread_cond_t *restrict cond, 
const pthread_condattr_
-     struct pthread_cond_monotonic *e = (struct 
pthread_cond_monotonic*)malloc(sizeof(struct pthread_cond_monotonic));
-     e->ptr = cond;
- 
--    if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) {
--      sched_yield();
--      return EAGAIN;
-+    if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) {
-+      fprintf(stderr,"can't acquire write monotonic_conds_lock\n");
-+      exit(-1);
-     }
-     HASH_ADD_PTR(monotonic_conds, ptr, e);
-     pthread_rwlock_unlock(&monotonic_conds_lock);
-@@ -3811,9 +3811,9 @@ int pthread_cond_destroy_232(pthread_cond_t *cond)
- 
-   ftpl_init();
- 
--  if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) {
--    sched_yield();
--    return EBUSY;
-+  if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) {
-+    fprintf(stderr,"can't acquire write monotonic_conds_lock\n");
-+    exit(-1);
-   }
-   HASH_FIND_PTR(monotonic_conds, &cond, e);
-   if (e) {
-@@ -3897,9 +3897,9 @@ int pthread_cond_timedwait_common(pthread_cond_t *cond, 
pthread_mutex_t *mutex,
- 
-   if (abstime != NULL)
-   {
--    if (pthread_rwlock_tryrdlock(&monotonic_conds_lock) != 0) {
--      sched_yield();
--      return EAGAIN;
-+    if (pthread_rwlock_rdlock(&monotonic_conds_lock) != 0) {
-+      fprintf(stderr,"can't acquire read monotonic_conds_lock\n");
-+      exit(-1);
-     }
-     HASH_FIND_PTR(monotonic_conds, &cond, e);
-     pthread_rwlock_unlock(&monotonic_conds_lock);
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0010-485.patch 
faketime-0.9.12/debian/patches/0010-485.patch
--- faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/0010-485.patch  
2025-01-27 08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/patches/0010-485.patch       1969-12-31 
19:00:00.000000000 -0500
@@ -1,36 +0,0 @@
-From: Gianfranco Costamagna <[email protected]>
-Date: Wed, 22 Jan 2025 12:22:37 +0100
-Subject: [PATCH] test/libmallocintercept.c: fix write function unused return
- value
-MIME-Version: 1.0
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-We should ignore the return value for logging function, to fix a new gcc ftbfs
-libmallocintercept.c: In function ‘print_msg’:
-libmallocintercept.c:27:9: error: ignoring return value of ‘write’ declared 
with attribute ‘warn_unused_result’ [-Werror=unused-result]
-   27 |         write(0, msg, strlen(msg));
-      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-This was merged upstream in this MR:
-  https://github.com/wolfcw/libfaketime/pull/485
----
- test/libmallocintercept.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/test/libmallocintercept.c b/test/libmallocintercept.c
-index e789d34..61edbb8 100644
---- a/test/libmallocintercept.c
-+++ b/test/libmallocintercept.c
-@@ -24,7 +24,9 @@
- #include <unistd.h>
- 
- static void print_msg(const char *msg) {
--      write(0, msg, strlen(msg));
-+      size_t out;
-+      out = write(0, msg, strlen(msg));
-+      (void) out; /* unused */
- }
- 
- static void* actual_malloc(size_t size) {
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/add-regression-test-for-utimens-now.patch
 faketime-0.9.12/debian/patches/add-regression-test-for-utimens-now.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/add-regression-test-for-utimens-now.patch
       1969-12-31 19:00:00.000000000 -0500
+++ faketime-0.9.12/debian/patches/add-regression-test-for-utimens-now.patch    
2026-03-28 13:53:05.000000000 -0400
@@ -0,0 +1,101 @@
+From: Aquila Macedo <[email protected]>
+Date: Fri, 27 Mar 2026 16:09:02 -0300
+Subject: Add regression test for utimensat/futimens now handling
+Origin: upstream, 483a7a703cd614452e096aa6a483cbf834c8b069
+
+Exercise the NULL and UTIME_NOW timestamp paths in timetest so the
+file-timestamp "set to now" case is covered by the test suite.
+---
+ test/timetest.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 65 insertions(+)
+
+diff --git a/test/timetest.c b/test/timetest.c
+index 18c0546..cd52cdd 100644
+--- a/test/timetest.c
++++ b/test/timetest.c
+@@ -19,6 +19,7 @@
+  */
+ 
+ #define _GNU_SOURCE
++#include <fcntl.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <time.h>
+@@ -44,6 +45,69 @@
+ 
+ #define SIG SIGUSR1
+ 
++static void test_utimens_now(void)
++{
++  char path[] = "/tmp/libfaketime-utimensat-XXXXXX";
++  struct timespec now_times[2];
++  int fd;
++
++  fd = mkstemp(path);
++  if (fd == -1)
++  {
++    perror("mkstemp");
++    exit(EXIT_FAILURE);
++  }
++
++  if (utimensat(AT_FDCWD, path, NULL, 0) == -1)
++  {
++    perror("utimensat(NULL)");
++    unlink(path);
++    exit(EXIT_FAILURE);
++  }
++
++  if (futimens(fd, NULL) == -1)
++  {
++    perror("futimens(NULL)");
++    close(fd);
++    unlink(path);
++    exit(EXIT_FAILURE);
++  }
++
++  now_times[0].tv_sec = now_times[1].tv_sec = 0;
++  now_times[0].tv_nsec = now_times[1].tv_nsec = UTIME_NOW;
++
++  if (utimensat(AT_FDCWD, path, now_times, 0) == -1)
++  {
++    perror("utimensat(UTIME_NOW)");
++    close(fd);
++    unlink(path);
++    exit(EXIT_FAILURE);
++  }
++
++  if (futimens(fd, now_times) == -1)
++  {
++    perror("futimens(UTIME_NOW)");
++    close(fd);
++    unlink(path);
++    exit(EXIT_FAILURE);
++  }
++
++  if (close(fd) == -1)
++  {
++    perror("close");
++    unlink(path);
++    exit(EXIT_FAILURE);
++  }
++
++  if (unlink(path) == -1)
++  {
++    perror("unlink");
++    exit(EXIT_FAILURE);
++  }
++
++  printf("utimensat()/futimens(): NOW handling passed\n");
++}
++
+ static void
+ handler(int sig, siginfo_t *si, void *uc)
+ {
+@@ -237,6 +301,7 @@ printf("%s", 0 == 1 ? argv[0] : "");
+     printf("gettimeofday() : Current date and time: %s", ctime(&tv.tv_sec));
+ 
+ #ifndef __APPLE__
++    test_utimens_now();
+     if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
+     {
+       perror("sigprocmask");
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/fix-utimensat-futimens-fake-now-handling.patch
 faketime-0.9.12/debian/patches/fix-utimensat-futimens-fake-now-handling.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/fix-utimensat-futimens-fake-now-handling.patch
  1969-12-31 19:00:00.000000000 -0500
+++ 
faketime-0.9.12/debian/patches/fix-utimensat-futimens-fake-now-handling.patch   
    2026-03-28 13:53:05.000000000 -0400
@@ -0,0 +1,103 @@
+From: Aquila Macedo <[email protected]>
+Date: Fri, 27 Mar 2026 16:04:18 -0300
+Subject: Fix utimensat/futimens handling of fake "now"
+Origin: upstream, e8a1c1fd3b265db7071823398591dc592ec8e65d
+
+Use fake_clock_gettime(CLOCK_REALTIME) to resolve NULL/UTIME_NOW
+timestamps instead of reconstructing them from user_offset. This
+avoids invalid timestamp handling in start-at faketime mode, where
+"now" is derived from the configured base time plus elapsed real time.
+
+Closes: #535
+---
+ src/libfaketime.c | 38 +++++++++++++++++++++++++++++++-------
+ 1 file changed, 31 insertions(+), 7 deletions(-)
+
+diff --git a/src/libfaketime.c b/src/libfaketime.c
+index 6d1a575..0e3d1ce 100644
+--- a/src/libfaketime.c
++++ b/src/libfaketime.c
+@@ -1243,9 +1243,22 @@ int utimes(const char *filename, const struct timeval 
times[2])
+   return result;
+ }
+ 
++static int fake_current_realtime(struct timespec *tp)
++{
++  int result;
++
++  DONT_FAKE_TIME(result = (*real_clock_gettime)(CLOCK_REALTIME, tp));
++  if (result == -1)
++  {
++    return -1;
++  }
++
++  return fake_clock_gettime(CLOCK_REALTIME, tp);
++}
++
+ /* This conditionally offsets 2 timespec values. The caller's out_times array
+  * always contains valid translated values, even if in_times was NULL. */
+-static void fake_two_timespec(const struct timespec in_times[2], struct 
timespec out_times[2])
++static int fake_two_timespec(const struct timespec in_times[2], struct 
timespec out_times[2])
+ {
+   if (in_times == NULL) /* Translate NULL into 2 UTIME_NOW values */
+   {
+@@ -1254,7 +1267,7 @@ static void fake_two_timespec(const struct timespec 
in_times[2], struct timespec
+     in_times = out_times;
+   }
+   struct timespec now;
+-  now.tv_nsec = UTIME_OMIT; /* Wait to grab the current time to see if it's 
actually needed */
++  int have_fake_now = 0;
+   int j;
+   for (j = 0; j <= 1; j++)
+   {
+@@ -1263,11 +1276,15 @@ static void fake_two_timespec(const struct timespec 
in_times[2], struct timespec
+     {
+       if (fake_utime_disabled && in_times[j].tv_nsec == UTIME_NOW)
+       { /* The user wants their given fake times left alone but they 
requested NOW, so turn it into fake NOW */
+-        if (now.tv_nsec == UTIME_OMIT) /* did we grab "now" yet? */
++        if (!have_fake_now)
+         {
+-          DONT_FAKE_TIME(real_clock_gettime(CLOCK_REALTIME, &now));
++          if (fake_current_realtime(&now) == -1)
++          {
++            return -1;
++          }
++          have_fake_now = 1;
+         }
+-        timeradd2(&now, &user_offset, &out_times[j], n);
++        out_times[j] = now;
+       }
+       else if (out_times != in_times)
+       { /* Just preserve the input value */
+@@ -1279,6 +1296,7 @@ static void fake_two_timespec(const struct timespec 
in_times[2], struct timespec
+       timersub2(&in_times[j], &user_offset, &out_times[j], n);
+     }
+   }
++  return 0;
+ }
+ 
+ #ifdef MACOS_DYLD_INTERPOSE
+@@ -1292,7 +1310,10 @@ int utimensat(int dirfd, const char *filename, const 
struct timespec times[2], i
+ 
+   int result;
+   struct timespec tn[2];
+-  fake_two_timespec(times, tn);
++  if (fake_two_timespec(times, tn) == -1)
++  {
++    return -1;
++  }
+ #ifdef MACOS_DYLD_INTERPOSE
+   DONT_FAKE_TIME(result = utimensat(dirfd, filename, tn, flags));
+ #else
+@@ -1312,7 +1333,10 @@ int futimens(int fd, const struct timespec times[2])
+ 
+   int result;
+   struct timespec tn[2];
+-  fake_two_timespec(times, tn);
++  if (fake_two_timespec(times, tn) == -1)
++  {
++    return -1;
++  }
+ #ifdef MACOS_DYLD_INTERPOSE
+   DONT_FAKE_TIME(result = futimens(fd, tn));
+ #else
diff -Nru 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/interpose-clock_gettime64.patch
 faketime-0.9.12/debian/patches/interpose-clock_gettime64.patch
--- 
faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/interpose-clock_gettime64.patch
 2025-01-27 08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/patches/interpose-clock_gettime64.patch      
1969-12-31 19:00:00.000000000 -0500
@@ -1,86 +0,0 @@
-From: Helge Deller <[email protected]>
-Date: Sun, 12 Jan 2025 22:23:16 +0000
-Subject: Interpose clock_gettime64
-
-Since debian generally added 64-bit time support on 32-bit
-arches, now glibc sometimes calls the clock_gettime64 syscall
-(and library wrapper).  This function was missing, and is added here.
-
-Closes: #1064555
-
-
-This patch is part of an upstream MR:
-  https://github.com/wolfcw/libfaketime/pull/487
----
- src/libfaketime.c | 24 ++++++++++++++++++++++++
- test/Makefile     |  2 +-
- 2 files changed, 25 insertions(+), 1 deletion(-)
-
-diff --git a/src/libfaketime.c b/src/libfaketime.c
-index c59c122..cb37bcf 100644
---- a/src/libfaketime.c
-+++ b/src/libfaketime.c
-@@ -164,6 +164,13 @@ struct utimbuf {
- #include <sys/random.h>
- #endif
- 
-+/* __timespec64 is needed for clock_gettime64 on 32-bit architectures */
-+struct __timespec64
-+{
-+  uint64_t tv_sec;         /* Seconds */
-+  uint64_t tv_nsec;        /* Nanoseconds */
-+};
-+
- /*
-  * Per thread variable, which we turn on inside real_* calls to avoid 
modifying
-  * time multiple times of for the whole process to prevent faking time
-@@ -201,6 +208,7 @@ static time_t       (*real_time)            (time_t *);
- static int          (*real_ftime)           (struct timeb *);
- static int          (*real_gettimeofday)    (struct timeval *, void *);
- static int          (*real_clock_gettime)   (clockid_t clk_id, struct 
timespec *tp);
-+static int          (*real_clock_gettime64) (clockid_t clk_id, struct 
__timespec64 *tp);
- #ifdef TIME_UTC
- static int          (*real_timespec_get)    (struct timespec *ts, int base);
- #endif
-@@ -2417,6 +2425,17 @@ int clock_gettime(clockid_t clk_id, struct timespec *tp)
-   return result;
- }
- 
-+/* this is used by 32-bit architectures only */
-+int __clock_gettime64(clockid_t clk_id, struct __timespec64 *tp64)
-+{
-+  struct timespec tp;
-+  int result;
-+
-+  result = clock_gettime(clk_id, &tp);
-+  tp64->tv_sec = tp.tv_sec;
-+  tp64->tv_nsec = tp.tv_nsec;
-+  return result;
-+}
- 
- #ifdef TIME_UTC
- #ifdef MACOS_DYLD_INTERPOSE
-@@ -2760,6 +2779,11 @@ static void ftpl_really_init(void)
-   {
-     real_clock_gettime  =   dlsym(RTLD_NEXT, "clock_gettime");
-   }
-+  real_clock_gettime64 =    dlsym(RTLD_NEXT, "clock_gettime64");
-+  if (NULL == real_clock_gettime64)
-+  {
-+    real_clock_gettime64 =  dlsym(RTLD_NEXT, "__clock_gettime64");
-+  }
- #ifdef FAKE_TIMERS
- #if defined(__sun)
-     real_timer_gettime_233 =  dlsym(RTLD_NEXT, "timer_gettime");
-diff --git a/test/Makefile b/test/Makefile
-index 763ebc4..01cbd9f 100644
---- a/test/Makefile
-+++ b/test/Makefile
-@@ -1,6 +1,6 @@
- CC = gcc
- 
--CFLAGS += -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra 
$(FAKETIME_COMPILE_CFLAGS)
-+CFLAGS += -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra 
$(FAKETIME_COMPILE_CFLAGS) -U_FILE_OFFSET_BITS -U_TIME_BITS
- LDFLAGS += -lrt -lpthread
- 
- SRC = timetest.c
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/series 
faketime-0.9.12/debian/patches/series
--- faketime-0.9.10+2024-06-05+gba9ed5b2/debian/patches/series  2025-01-27 
08:14:40.000000000 -0500
+++ faketime-0.9.12/debian/patches/series       2026-03-28 13:53:05.000000000 
-0400
@@ -1,10 +1,2 @@
-interpose-clock_gettime64.patch
-0002-Fix-interposition-of-clock_gettime64.patch
-0003-Interpose-__time64.patch
-0004-Interpose-gettimeofday64.patch
-0005-Re-disable-faking-utime-by-default.patch
-0006-Replace-data-race-with-use-of-pthread_once-ftpl_init.patch
-0007-Replace-data-race-with-use-of-pthread_once-ft_shm_in.patch
-0008-Call-ftpl_init-before-using-monotonic_conds_lock.patch
-0009-Don-t-use-_try_-locking-calls-for-monotonic_conds_lo.patch
-0010-485.patch
+fix-utimensat-futimens-fake-now-handling.patch
+add-regression-test-for-utimens-now.patch
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/debian/salsa-ci.yml 
faketime-0.9.12/debian/salsa-ci.yml
--- faketime-0.9.10+2024-06-05+gba9ed5b2/debian/salsa-ci.yml    1969-12-31 
19:00:00.000000000 -0500
+++ faketime-0.9.12/debian/salsa-ci.yml 2026-03-28 13:53:05.000000000 -0400
@@ -0,0 +1,3 @@
+---
+include:
+  - 
https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/.github/workflows/make-test.yml 
faketime-0.9.12/.github/workflows/make-test.yml
--- faketime-0.9.10+2024-06-05+gba9ed5b2/.github/workflows/make-test.yml        
2024-06-05 13:52:44.000000000 -0400
+++ faketime-0.9.12/.github/workflows/make-test.yml     2025-06-09 
08:31:15.000000000 -0400
@@ -12,7 +12,7 @@
   build:
     strategy:
       matrix:
-        os: [ubuntu-latest, macOS-latest]
+        os: [ubuntu-latest, ubuntu-22.04]
     runs-on: ${{ matrix.os }}
 
     steps:
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/Makefile faketime-0.9.12/Makefile
--- faketime-0.9.10+2024-06-05+gba9ed5b2/Makefile       2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/Makefile    2025-06-09 08:31:15.000000000 -0400
@@ -33,23 +33,4 @@
        $(MAKE) $(SELECTOR) -C src distclean
        $(MAKE) $(SELECTOR) -C test distclean
 
-macarm64:
-       $(MAKE) $(SELECTOR) -C src clean
-       $(MAKE) $(SELECTOR) -C src distclean
-       $(MAKE) $(SELECTOR) -C src all
-#      $(MAKE) $(SELECTOR) -C test all
-#      $(MAKE) $(SELECTOR) -C test distclean
-       $(MAKE) $(SELECTOR) -C src install
-       $(MAKE) $(SELECTOR) -C man install
-       $(INSTALL) -dm0755 "${DESTDIR}${PREFIX}/share/doc/faketime/"
-       $(INSTALL) -m0644 README "${DESTDIR}${PREFIX}/share/doc/faketime/README"
-       $(INSTALL) -m0644 NEWS "${DESTDIR}${PREFIX}/share/doc/faketime/NEWS"
-
-macarm64full:
-       $(MAKE) $(SELECTOR) -C src clean
-       $(MAKE) $(SELECTOR) -C src distclean
-       $(MAKE) $(SELECTOR) -C src all
-       $(MAKE) $(SELECTOR) -C test all
-#      $(MAKE) $(SELECTOR) -C test distclean
-
 .PHONY: all test install uninstall clean distclean
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/man/faketime.1 
faketime-0.9.12/man/faketime.1
--- faketime-0.9.10+2024-06-05+gba9ed5b2/man/faketime.1 2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/man/faketime.1      2025-06-09 08:31:15.000000000 -0400
@@ -1,4 +1,4 @@
-.TH FAKETIME "1" "March 2022" "faketime 0.9.10" wolfcw
+.TH FAKETIME "1" "June 2025" "faketime 0.9.12" wolfcw
 .SH NAME
 faketime \- manipulate the system time for a given command
 .SH SYNOPSIS
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/NEWS faketime-0.9.12/NEWS
--- faketime-0.9.10+2024-06-05+gba9ed5b2/NEWS   2024-06-05 13:52:44.000000000 
-0400
+++ faketime-0.9.12/NEWS        2025-06-09 08:31:15.000000000 -0400
@@ -1,3 +1,20 @@
+List of changes for v0.9.12
+===========================
+
+Since 0.9.11:
+    - Improved macOS compatibility (@usertam)
+
+Since 0.9.10:
+    - Fixed various cross-platform compile-time issues
+    - Honor nanosecond parameters/fields in relevant system calls
+    - Limited improvements to enhance compatibility with other
+      LD_PRELOAD libraries
+    - Added selected more intercepted system calls
+    - Unset FAKETIME_SHARED automatically for child processes
+      when enabling FAKETIME_FLSHM=1
+    - Disable shared memory for child processes through
+      FAKETIME_DISABLE_SHM=1
+
 Since 0.9.9:
     - automatically try to decide about FORCE_MONOTONIC_FIX
       at run-time when not set as a compile-time flag
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/README faketime-0.9.12/README
--- faketime-0.9.10+2024-06-05+gba9ed5b2/README 2024-06-05 13:52:44.000000000 
-0400
+++ faketime-0.9.12/README      2025-06-09 08:31:15.000000000 -0400
@@ -1,5 +1,5 @@
-libfaketime, version 0.9.10 (March 2022)
-========================================
+libfaketime, version 0.9.12 (June 2025)
+=======================================
 
 
 Content of this file:
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/README.OSX 
faketime-0.9.12/README.OSX
--- faketime-0.9.10+2024-06-05+gba9ed5b2/README.OSX     2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/README.OSX  2025-06-09 08:31:15.000000000 -0400
@@ -166,3 +166,50 @@
 and always takes precedence over other user-controlled settings. It can
 be re-set to 0 (zero) to work around potential incompatibilities or if
 you do not want libfaketime applied to your software.
+
+5) Working with the new arm64e system binaries in Apple Silicon
+---------------------------------------------------------------
+
+Since Apple Silicon, Apple started shipping system binaries compiled against
+the `arm64e` ABI. This new ABI enforces Pointer Authentication Codes (PACs),
+and enforces assembly instructions to sign and check pointer signatures to
+prevent malicious control flow altering.
+
+    $ file /bin/date
+    /bin/date: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 
64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
+    /bin/date (for architecture x86_64):    Mach-O 64-bit executable x86_64
+    /bin/date (for architecture arm64e):    Mach-O 64-bit executable arm64e
+
+Most importantly, the new `arm64e` ABI is incompatible with the normal `arm64`
+ABI we are used to; this is done so that everything `arm64e` is PAC-enforced.
+
+As a result, this will happen when we try to hook naive `arm64` libfaketime on
+system binaries (and vice versa with `arm64e` libfaketime on `arm64` binaries):
+
+    $ DYLD_INSERT_LIBRARIES=libfaketime.1.dylib /bin/date
+    dyld[5788]: terminating because inserted dylib 'libfaketime.1.dylib' could 
not be loaded:
+    tried: 'libfaketime.1.dylib' (mach-o file, but is an incompatible 
architecture (have 'arm64', need 'arm64e'))
+
+Since PR #497, we now compile libfaketime with a fat library/binary setup, so
+that we support both ABIs at the same time:
+
+    $ file libfaketime.1.dylib
+    libfaketime.1.dylib: Mach-O universal binary with 2 architectures: 
[arm64:Mach-O 64-bit dynamically linked shared library arm64] [arm64e:Mach-O 
64-bit dynamically linked shared library arm64e]
+    libfaketime.1.dylib (for architecture arm64):   Mach-O 64-bit dynamically 
linked shared library arm64
+    libfaketime.1.dylib (for architecture arm64e):  Mach-O 64-bit dynamically 
linked shared library arm64e
+
+Unfortunately, Apple does not support running third-party `arm64e` code yet,
+since the ABI is still unstable. This means that you cannot use libfaketime
+on system `arm64e` binaries out of the box, at the time of writing.
+
+If you really need to, you may disable SIP in the recovery terminal:
+
+    (in recovery)       # csrutil disable
+
+And enable the experimental ABI after boot:
+
+    (in regular boot)   $ sudo nvram boot-args=-arm64e_preview_abi
+
+Then `arm64e` should work as-is. This use case is rather uncommon since most
+userspace binaries will remain `arm64` for the time being, until Apple really
+doubles down on `arm64e`. Regardless, we should be prepared for that.
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/src/faketime.c 
faketime-0.9.12/src/faketime.c
--- faketime-0.9.10+2024-06-05+gba9ed5b2/src/faketime.c 2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/src/faketime.c      2025-06-09 08:31:15.000000000 -0400
@@ -1,7 +1,7 @@
 /*
  *  libfaketime wrapper command
  *
- *  This file is part of libfaketime, version 0.9.10
+ *  This file is part of libfaketime, version 0.9.12
  *
  *  libfaketime is free software; you can redistribute it and/or modify it
  *  under the terms of the GNU General Public License v2 as published by the
@@ -48,7 +48,7 @@
 
 #include "faketime_common.h"
 
-const char version[] = "0.9.10";
+const char version[] = "0.9.12";
 
 #if (defined __APPLE__) || (defined __sun)
 static const char *date_cmd = "gdate";
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/src/libfaketime.c 
faketime-0.9.12/src/libfaketime.c
--- faketime-0.9.10+2024-06-05+gba9ed5b2/src/libfaketime.c      2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/src/libfaketime.c   2025-06-09 08:31:15.000000000 -0400
@@ -1,5 +1,5 @@
 /*
- *  This file is part of libfaketime, version 0.9.10
+ *  This file is part of libfaketime, version 0.9.12
  *
  *  libfaketime is free software; you can redistribute it and/or modify it
  *  under the terms of the GNU General Public License v2 as published by the
@@ -42,6 +42,7 @@
 #endif
 #include <time.h>
 #ifdef MACOS_DYLD_INTERPOSE
+#include <pthread.h>
 #include <sys/time.h>
 #include <utime.h>
 #endif
@@ -58,6 +59,9 @@
 #ifdef __linux__
 #include <stdarg.h>
 #include <sys/syscall.h>
+#ifdef INTERCEPT_FUTEX
+#include <linux/futex.h>
+#endif
 #else
 #error INTERCEPT_SYSCALL should only be defined on GNU/Linux systems.
 #endif
@@ -164,6 +168,20 @@
 #include <sys/random.h>
 #endif
 
+/* __timespec64 is needed for clock_gettime64 on 32-bit architectures */
+struct __timespec64
+{
+  uint64_t tv_sec;         /* Seconds */
+  uint32_t tv_nsec;        /* this is 32-bit, apparently! */
+};
+
+/* __timespec64 is needed for clock_gettime64 on 32-bit architectures */
+struct __timeval64
+{
+  uint64_t tv_sec;         /* Seconds */
+  uint64_t tv_usec;        /* this is 64-bit, apparently! */
+};
+
 /*
  * Per thread variable, which we turn on inside real_* calls to avoid modifying
  * time multiple times of for the whole process to prevent faking time
@@ -190,10 +208,12 @@
 static int          (*real_fxstat)          (int, int, struct stat *);
 static int          (*real_fxstatat)        (int, int, const char *, struct 
stat *, int);
 static int          (*real_lxstat)          (int, const char *, struct stat *);
+#if !defined(__APPLE__) || !__DARWIN_ONLY_64_BIT_INO_T
 static int          (*real_xstat64)         (int, const char *, struct stat64 
*);
 static int          (*real_fxstat64)        (int, int , struct stat64 *);
 static int          (*real_fxstatat64)      (int, int , const char *, struct 
stat64 *, int);
 static int          (*real_lxstat64)        (int, const char *, struct stat64 
*);
+#endif
 #ifdef STATX_TYPE
 static int          (*real_statx)           (int dirfd, const char *pathname, 
int flags, unsigned int mask, struct statx *statxbuf);
 #endif
@@ -201,6 +221,7 @@
 static int          (*real_ftime)           (struct timeb *);
 static int          (*real_gettimeofday)    (struct timeval *, void *);
 static int          (*real_clock_gettime)   (clockid_t clk_id, struct timespec 
*tp);
+static int          (*real_clock_gettime64) (clockid_t clk_id, struct 
__timespec64 *tp);
 #ifdef TIME_UTC
 static int          (*real_timespec_get)    (struct timespec *ts, int base);
 #endif
@@ -217,7 +238,7 @@
 static pthread_rwlock_t monotonic_conds_lock;
 #endif
 
-#ifndef __APPLEOSX__
+#ifndef __APPLE__
 #ifdef FAKE_TIMERS
 static int          (*real_timer_settime_22)   (int timerid, int flags, const 
struct itimerspec *new_value,
                                                 struct itimerspec * old_value);
@@ -263,7 +284,7 @@
 static int          (*real_sem_timedwait)   (sem_t*, const struct timespec*);
 static int          (*real_sem_clockwait)   (sem_t *sem, clockid_t clockid, 
const struct timespec *abstime);
 #endif
-#ifdef __APPLEOSX__
+#ifdef __APPLE__
 static int          (*real_clock_get_time)  (clock_serv_t clock_serv, 
mach_timespec_t *cur_timeclockid_t);
 static int          apple_clock_gettime     (clockid_t clk_id, struct timespec 
*tp);
 static clock_serv_t clock_serv_real;
@@ -304,7 +325,7 @@
 #define CHECK_MISSING_REAL(name) \
   check_missing_real(#name, (NULL == real_##name))
 
-static int initialized = 0;
+static pthread_once_t initialized_once_control = PTHREAD_ONCE_INIT;
 
 /* prototypes */
 static int    fake_gettimeofday(struct timeval *tv);
@@ -521,16 +542,20 @@
   }
 }
 
+static pthread_once_t ft_shm_initialized_once_control = PTHREAD_ONCE_INIT;
+
+static void ft_shm_really_init (void);
 static void ft_shm_init (void)
 {
+  pthread_once(&ft_shm_initialized_once_control, ft_shm_really_init);
+}
+
+static void ft_shm_really_init (void)
+{
   int ticks_shm_fd;
   char sem_name[256], shm_name[256], *ft_shared_env = 
getenv("FAKETIME_SHARED");
   sem_t *shared_semR = NULL;
   static int nt=1;
-  static int ft_shm_initialized = 0;
-
-  /* do all of this once only */
-  if (ft_shm_initialized > 0) return;
 
   /* create semaphore and shared memory locally unless it has been passed 
along */
   if (ft_shared_env == NULL)
@@ -610,8 +635,6 @@
   { /* force the deletion of the shm sync env variable */
     unsetenv("FAKETIME_SHARED");
   }
-
-  ft_shm_initialized = 1;
 }
 
 static void ft_cleanup (void)
@@ -673,7 +696,7 @@
 /* Get system time from system for all clocks */
 static void system_time_from_system (struct system_time_s * systime)
 {
-#ifdef __APPLEOSX__
+#ifdef __APPLE__
   /* from 
https://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x
 */
   clock_serv_t cclock;
   mach_timespec_t mts;
@@ -876,7 +899,7 @@
  *      =======================================================================
  */
 #ifdef FAKE_UTIME
-static int fake_utime_disabled = 0;
+static int fake_utime_disabled = 1;
 #endif
 
 
@@ -962,6 +985,7 @@
 #endif
 }
 
+#ifndef __APPLE__
 static inline void fake_stat64buf (struct stat64 *buf) {
 #ifndef st_atime
   lock_for_stat();
@@ -971,18 +995,13 @@
   unlock_for_stat();
 #else
   lock_for_stat();
-#ifndef __APPLE__
   fake_clock_gettime(CLOCK_REALTIME, &buf->st_ctim);
   fake_clock_gettime(CLOCK_REALTIME, &buf->st_atim);
   fake_clock_gettime(CLOCK_REALTIME, &buf->st_mtim);
-#else
-  fake_clock_gettime(CLOCK_REALTIME, &buf->st_ctimespec);
-  fake_clock_gettime(CLOCK_REALTIME, &buf->st_atimespec);
-  fake_clock_gettime(CLOCK_REALTIME, &buf->st_mtimespec);
-#endif
   unlock_for_stat();
 #endif
 }
+#endif
 
 /* macOS dyld interposing uses the function's real name instead of real_name */
 #ifdef MACOS_DYLD_INTERPOSE
@@ -1092,25 +1111,19 @@
 {
   STAT_HANDLER(lxstat, buf, ver, path, buf);
 }
-#endif
 
-#ifndef __APPLE__
 /* Contributed by Philipp Hachtmann in version 0.6 */
 int __xstat64 (int ver, const char *path, struct stat64 *buf)
 {
   STAT64_HANDLER(xstat64, buf, ver, path, buf);
 }
-#endif
 
-#ifndef __APPLE__
 /* Contributed by Philipp Hachtmann in version 0.6 */
 int __fxstat64 (int ver, int fildes, struct stat64 *buf)
 {
   STAT64_HANDLER(fxstat64, buf, ver, fildes, buf);
 }
-#endif
 
-#ifndef __APPLE__
 /* Added in v0.8 as suggested by Daniel Kahn Gillmor */
 #ifndef NO_ATFILE
 int __fxstatat64 (int ver, int fildes, const char *filename, struct stat64 
*buf, int flag)
@@ -1118,16 +1131,14 @@
   STAT64_HANDLER(fxstatat64, buf, ver, fildes, filename, buf, flag);
 }
 #endif
-#endif
 
-#ifndef __APPLE__
 /* Contributed by Philipp Hachtmann in version 0.6 */
 int __lxstat64 (int ver, const char *path, struct stat64 *buf)
 {
   STAT64_HANDLER(lxstat64, buf, ver, path, buf);
 }
-#endif
-#endif
+#endif  /* ifndef __APPLE__ */
+#endif  /* ifdef FAKE_STAT */
 
 #ifdef STATX_TYPE
 static inline void fake_statx_timestamp(struct statx_timestamp* p)
@@ -2346,44 +2357,12 @@
 #endif
 {
   int result;
-  static int recursion_depth = 0;
 
-  if (!initialized)
-  {
-    recursion_depth++;
-#ifdef FAIL_PRE_INIT_CALLS
-      fprintf(stderr, "libfaketime: clock_gettime() was called before 
initialization.\n");
-      fprintf(stderr, "libfaketime:  Returning -1 on clock_gettime().\n");
-      if (tp != NULL)
-      {
-        tp->tv_sec = 0;
-        tp->tv_nsec = 0;
-      }
-      return -1;
-#else
-    if (recursion_depth == 2)
-    {
-      fprintf(stderr, "libfaketime: Unexpected recursive calls to 
clock_gettime() without proper initialization. Trying alternative.\n");
-      DONT_FAKE_TIME(ftpl_init()) ;
-    }
-    else if (recursion_depth == 3)
-    {
-      fprintf(stderr, "libfaketime: Cannot recover from unexpected recursive 
calls to clock_gettime().\n");
-      fprintf(stderr, "libfaketime:  Please check whether any other libraries 
are in use that clash with libfaketime.\n");
-      fprintf(stderr, "libfaketime:  Returning -1 on clock_gettime() to break 
recursion now... if that does not work, please check other libraries' error 
handling.\n");
-      if (tp != NULL)
-      {
-        tp->tv_sec = 0;
-        tp->tv_nsec = 0;
-      }
-      return -1;
-    }
-    else {
-      ftpl_init();
-    }
-#endif
-    recursion_depth--;
-  }
+  ftpl_init();
+  // If ftpl_init ends up recursing, pthread_once will deadlock.
+  // (Previously we attempted to detect this situation, and bomb out,
+  // but the approach taken wasn't thread-safe and broke in practice.)
+
   /* sanity check */
   if (tp == NULL)
   {
@@ -2417,6 +2396,50 @@
   return result;
 }
 
+/* this is used by 32-bit architectures only */
+int __clock_gettime64(clockid_t clk_id, struct __timespec64 *tp64)
+{
+  struct timespec tp;
+  int result;
+
+  result = clock_gettime(clk_id, &tp);
+  tp64->tv_sec = tp.tv_sec;
+  tp64->tv_nsec = tp.tv_nsec;
+  return result;
+}
+
+/* this is used by 32-bit architectures only */
+int __gettimeofday64(struct __timeval64 *tv64, void *tz)
+{
+  struct timeval tv;
+  int result;
+
+  result = gettimeofday(&tv, tz);
+  tv64->tv_sec = tv.tv_sec;
+  tv64->tv_usec = tv.tv_usec;
+  return result;
+}
+
+/* this is used by 32-bit architectures only */
+uint64_t __time64(uint64_t *write_out)
+{
+  struct timespec tp;
+  uint64_t output;
+  int error;
+
+  error = clock_gettime(CLOCK_REALTIME, &tp);
+  if (error == -1)
+  {
+    return (uint64_t)error;
+  }
+  output = tp.tv_sec;
+
+  if (write_out)
+  {
+    *write_out = output;
+  }
+  return output;
+}
 
 #ifdef TIME_UTC
 #ifdef MACOS_DYLD_INTERPOSE
@@ -2656,10 +2679,12 @@
   real_fxstat =             dlsym(RTLD_NEXT, "__fxstat");
   real_fxstatat =           dlsym(RTLD_NEXT, "__fxstatat");
   real_lxstat =             dlsym(RTLD_NEXT, "__lxstat");
+#if !defined(__APPLE__) || !__DARWIN_ONLY_64_BIT_INO_T
   real_xstat64 =            dlsym(RTLD_NEXT,"__xstat64");
   real_fxstat64 =           dlsym(RTLD_NEXT, "__fxstat64");
   real_fxstatat64 =         dlsym(RTLD_NEXT, "__fxstatat64");
   real_lxstat64 =           dlsym(RTLD_NEXT, "__lxstat64");
+#endif
 #ifdef STATX_TYPE
   real_statx =              dlsym(RTLD_NEXT, "statx");
 #endif
@@ -2751,7 +2776,7 @@
     exit(-1);
   }
 #endif
-#ifdef __APPLEOSX__
+#ifdef __APPLE__
   real_clock_get_time =     dlsym(RTLD_NEXT, "clock_get_time");
   real_clock_gettime  =     apple_clock_gettime;
 #else
@@ -2760,6 +2785,11 @@
   {
     real_clock_gettime  =   dlsym(RTLD_NEXT, "clock_gettime");
   }
+  real_clock_gettime64 =    dlsym(RTLD_NEXT, "clock_gettime64");
+  if (NULL == real_clock_gettime64)
+  {
+    real_clock_gettime64 =  dlsym(RTLD_NEXT, "__clock_gettime64");
+  }
 #ifdef FAKE_TIMERS
 #if defined(__sun)
     real_timer_gettime_233 =  dlsym(RTLD_NEXT, "timer_gettime");
@@ -2795,7 +2825,6 @@
 
 #undef dlsym
 #undef dlvsym
-  initialized = 1;
 
 #ifdef FAKE_STATELESS
   if (0) ft_shm_init();
@@ -3046,10 +3075,7 @@
 }
 
 inline static void ftpl_init(void) {
-  if (!initialized)
-  {
-    ftpl_really_init();
-  }
+  pthread_once(&initialized_once_control, ftpl_really_init);
 }
 
 void *ft_dlvsym(void *handle, const char *symbol, const char *version,
@@ -3511,7 +3537,7 @@
  *      =======================================================================
  */
 
-#ifdef __APPLEOSX__
+#ifdef __APPLE__
 /*
  * clock_gettime implementation for __APPLE__
  * @note It always behave like being called with CLOCK_REALTIME.
@@ -3724,9 +3750,9 @@
     struct pthread_cond_monotonic *e = (struct 
pthread_cond_monotonic*)malloc(sizeof(struct pthread_cond_monotonic));
     e->ptr = cond;
 
-    if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) {
-      sched_yield();
-      return EAGAIN;
+    if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) {
+      fprintf(stderr,"can't acquire write monotonic_conds_lock\n");
+      exit(-1);
     }
     HASH_ADD_PTR(monotonic_conds, ptr, e);
     pthread_rwlock_unlock(&monotonic_conds_lock);
@@ -3739,9 +3765,11 @@
 {
   struct pthread_cond_monotonic* e;
 
-  if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) {
-    sched_yield();
-    return EBUSY;
+  ftpl_init();
+
+  if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) {
+    fprintf(stderr,"can't acquire write monotonic_conds_lock\n");
+    exit(-1);
   }
   HASH_FIND_PTR(monotonic_conds, &cond, e);
   if (e) {
@@ -3821,11 +3849,13 @@
   clockid_t clk_id;
   int result = 0;
 
+  ftpl_init();
+
   if (abstime != NULL)
   {
-    if (pthread_rwlock_tryrdlock(&monotonic_conds_lock) != 0) {
-      sched_yield();
-      return EAGAIN;
+    if (pthread_rwlock_rdlock(&monotonic_conds_lock) != 0) {
+      fprintf(stderr,"can't acquire read monotonic_conds_lock\n");
+      exit(-1);
     }
     HASH_FIND_PTR(monotonic_conds, &cond, e);
     pthread_rwlock_unlock(&monotonic_conds_lock);
@@ -4151,6 +4181,90 @@
 #endif
 
 #ifdef INTERCEPT_SYSCALL
+#ifdef INTERCEPT_FUTEX
+long handle_futex_syscall(long number, uint32_t* uaddr, int futex_op, uint32_t 
val, struct timespec* timeout, uint32_t* uaddr2, uint32_t val3) {
+  if (timeout == NULL) {
+    // not timeout related, just call the real syscall
+    goto futex_fallback;
+  }
+
+  // if ((futex_op & FUTEX_CMD_MASK) == FUTEX_WAIT_BITSET) {
+  if (1) {
+    clockid_t clk_id = CLOCK_MONOTONIC;
+    if (futex_op & FUTEX_CLOCK_REALTIME)
+      clk_id = CLOCK_REALTIME;
+
+    struct timespec real_tp, fake_tp;
+
+    DONT_FAKE_TIME((*real_clock_gettime)(clk_id, &real_tp));
+    fake_tp = real_tp;
+    if (fake_clock_gettime(clk_id, &fake_tp) == -1) {
+      goto futex_fallback;
+    }
+    // Create a corrected timeout by adjusting with the difference between
+    // real and fake timestamps
+    struct timespec adjusted_timeout, time_diff;
+    timespecsub(&fake_tp, &real_tp, &time_diff);
+    timespecsub(timeout, &time_diff, &adjusted_timeout);
+    // fprintf(stdout, "libfaketime: adjusted timeout: %ld.%09ld\n", 
adjusted_timeout.tv_sec, adjusted_timeout.tv_nsec);
+    long result;
+    result = real_syscall(number, uaddr, futex_op, val, &adjusted_timeout, 
uaddr2, val3);
+    if (result != 0) {
+      return result;
+    }
+
+    // Check if the futex timeout has already passed according to fake time
+    struct timespec now_fake;
+    if (fake_clock_gettime(clk_id, &now_fake) != 0) {
+      return result;
+    }
+
+    // If the timeout is already passed in fake time, return 0.
+    while (!timespeccmp(&now_fake, timeout, >=)) {
+      // Calculate how much real time we need to wait
+      struct timespec real_now, fake_now, wait_time;
+      DONT_FAKE_TIME((*real_clock_gettime)(clk_id, &real_now));
+      fake_clock_gettime(clk_id, &fake_now);
+
+      // Calculate how much fake time is left until the timeout
+      struct timespec fake_time_left;
+      timespecsub(timeout, &fake_now, &fake_time_left);
+
+      // Scale the fake time left by the user rate if set
+      if (user_rate_set && !dont_fake) {
+        timespecmul(&fake_time_left, 1.0 / user_rate, &wait_time);
+      } else {
+        wait_time = fake_time_left;
+      }
+
+      // Calculate the real timeout by adding the wait time to the current 
real time
+      struct timespec real_timeout;
+      timespecadd(&real_now, &wait_time, &real_timeout);
+
+      // fprintf(stdout, "libfaketime: recalculated real timeout: %ld.%09ld\n",
+      //         real_timeout.tv_sec, real_timeout.tv_nsec);
+
+      // Call the real syscall with the recalculated timeout
+      result = real_syscall(number, uaddr, futex_op, val, &real_timeout, 
uaddr2, val3);
+      if (result != 0) {
+        return result;
+      }
+
+      // Check if the futex timeout has already passed according to fake time
+      if (fake_clock_gettime(clk_id, &now_fake) != 0) {
+        return result;
+      }
+    }
+    return 0;
+  } else {
+    return real_syscall(number, uaddr, futex_op, val, timeout, uaddr2, val3);
+  }
+
+  futex_fallback:
+    return real_syscall(number, uaddr, futex_op, val, timeout, uaddr2, val3);
+}
+#endif
+
 /* see https://github.com/wolfcw/libfaketime/issues/301 */
 long syscall(long number, ...) {
   va_list ap;
@@ -4177,6 +4291,27 @@
     return clock_gettime(clk_id, tp);
   }
 
+#ifdef INTERCEPT_FUTEX
+  if (number == __NR_futex) {
+    uint32_t *uaddr;
+    int futex_op;
+    uint32_t val;
+    struct timespec *timeout;  /* or: uint32_t val2 */
+    uint32_t* uaddr2;
+    uint32_t val3;
+
+    uaddr = va_arg(ap, uint32_t*);
+    futex_op = va_arg(ap, int);
+    val = va_arg(ap, uint32_t);
+    timeout = va_arg(ap, struct timespec*);
+    uaddr2 = va_arg(ap, uint32_t*);
+    val3 = va_arg(ap, uint32_t);
+    va_end(ap);
+
+    return handle_futex_syscall(number, uaddr, futex_op, val, timeout, uaddr2, 
val3);
+  }
+#endif
+
   variadic_promotion_t a[syscall_max_args];
   for (int i = 0; i < syscall_max_args; i++)
     a[i] = va_arg(ap, variadic_promotion_t);
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/src/Makefile.OSX 
faketime-0.9.12/src/Makefile.OSX
--- faketime-0.9.10+2024-06-05+gba9ed5b2/src/Makefile.OSX       2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/src/Makefile.OSX    2025-06-09 08:31:15.000000000 -0400
@@ -56,21 +56,24 @@
 PREFIX ?= /usr/local
 
 CFLAGS += -DFAKE_SLEEP -DFAKE_INTERNAL_CALLS -DPREFIX='"'${PREFIX}'"' 
$(FAKETIME_COMPILE_CFLAGS) -DMACOS_DYLD_INTERPOSE -DFAKE_SETTIME
-LIB_LDFLAGS += -dynamiclib -current_version 0.9.10 -compatibility_version 0.7
+LIB_LDFLAGS += -dynamiclib -current_version 0.9.12 -compatibility_version 0.7
 
-# ARM64 MacOS (M1/M2/M3/Apple Silicon/etc) processors require a target set as 
their current version, or they
-# will receive the following error:
-# dyld[6675]: terminating because inserted dylib 
'/usr/local/lib/faketime/libfaketime.1.dylib' could not be loaded: tried: 
'/usr/local/lib/faketime/libfaketime.1.dylib' (mach-o file, but is an 
incompatible architecture (have 'arm64', need 'arm64e')), 
'/System/Volumes/Preboot/Cryptexes/OS/usr/local/lib/faketime/libfaketime.1.dylib'
 (no such file), '/usr/local/lib/faketime/libfaketime.1.dylib' (mach-o file, 
but is an incompatible architecture (have 'arm64', need 'arm64e'))
-# dyld[6675]: tried: '/usr/local/lib/faketime/libfaketime.1.dylib' (mach-o 
file, but is an incompatible architecture (have 'arm64', need 'arm64e')), 
'/System/Volumes/Preboot/Cryptexes/OS/usr/local/lib/faketime/libfaketime.1.dylib'
 (no such file), '/usr/local/lib/faketime/libfaketime.1.dylib' (mach-o file, 
but is an incompatible architecture (have 'arm64', need 'arm64e'))
-# Outputs `arm64` on ARM64
-OS := $(shell uname -m)
-# Outputs a number, eg 14.4 for MacOS Sonoma 14.4
-MACOS_PRODUCT_VERSION := $(shell sw_vers --productVersion | cut -d. -f1,2)
-
-# Check if arm64 is in OS, if so, add the target
-ifeq ($(OS),arm64)
-  CFLAGS += -target arm64e-apple-macos$(MACOS_PRODUCT_VERSION)
-  LIB_LDFLAGS += -target arm64e-apple-macos$(MACOS_PRODUCT_VERSION)
+# From macOS 13 onwards, system binaries are compiled against the new arm64e 
ABI on Apple Silicon.
+# These arm64e binaries enforce Pointer Authentication Code (PAC), and will 
refuse to run with
+# "unprotected" arm64 libraries. Meanwhile, older platforms might not 
recognize the new arm64e ABI.
+
+# Therefore, we now compile for two ABIs at the same time, producing a fat 
library of arm64e and arm64,
+# so in the end the OS gets to pick which architecture it wants at runtime.
+
+# In addition, we need to enable signing and authentication of indirect calls 
(-fptrauth-calls);
+# otherwise in ftpl_init, pthread_once will indirectly call ftpl_really_init, 
which then fail PAC.
+# Ideally this should be a compiler default for the arm64e ABI, but apparently 
not.
+
+ARCH := $(shell uname -m)
+
+ifeq ($(ARCH),arm64)
+    CFLAGS += -arch arm64e -arch arm64
+    CFLAGS += -fptrauth-calls -fptrauth-returns
 endif
 
 SONAME = 1
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/test/libmallocintercept.c 
faketime-0.9.12/test/libmallocintercept.c
--- faketime-0.9.10+2024-06-05+gba9ed5b2/test/libmallocintercept.c      
2024-06-05 13:52:44.000000000 -0400
+++ faketime-0.9.12/test/libmallocintercept.c   2025-06-09 08:31:15.000000000 
-0400
@@ -24,7 +24,9 @@
 #include <unistd.h>
 
 static void print_msg(const char *msg) {
-       write(0, msg, strlen(msg));
+       size_t out;
+       out = write(0, msg, strlen(msg));
+       (void) out; /* unused */
 }
 
 static void* actual_malloc(size_t size) {
diff -Nru faketime-0.9.10+2024-06-05+gba9ed5b2/test/Makefile 
faketime-0.9.12/test/Makefile
--- faketime-0.9.10+2024-06-05+gba9ed5b2/test/Makefile  2024-06-05 
13:52:44.000000000 -0400
+++ faketime-0.9.12/test/Makefile       2025-06-09 08:31:15.000000000 -0400
@@ -1,6 +1,6 @@
 CC = gcc
 
-CFLAGS += -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra 
$(FAKETIME_COMPILE_CFLAGS)
+CFLAGS += -std=gnu99 -Wall -DFAKE_STAT -Werror -Wextra 
$(FAKETIME_COMPILE_CFLAGS) -U_FILE_OFFSET_BITS -U_TIME_BITS
 LDFLAGS += -lrt -lpthread
 
 SRC = timetest.c

--- End Message ---
--- Begin Message ---
Fixed in the uploaded NMU 0.9.12-0.1.
I forgot to include Closes: #1132172 in d/changelog, so I am closing it manually after acceptance in the archive.
--- End Message ---

Reply via email to