summaryrefslogtreecommitdiff
path: root/sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch')
-rw-r--r--sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch154
1 files changed, 154 insertions, 0 deletions
diff --git a/sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch b/sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch
new file mode 100644
index 00000000..608582b5
--- /dev/null
+++ b/sys-libs/libfaketime/files/0001-Fake-__clock_gettime-and-similar-calls-using-__.-cal.patch
@@ -0,0 +1,154 @@
+From c1cc101f910867191cafa91f52dddf4b8d9bbe9d Mon Sep 17 00:00:00 2001
+From: Balint Reczey <balint@balintreczey.hu>
+Date: Wed, 16 Oct 2013 09:16:05 +0200
+Subject: [PATCH 1/2] Fake __clock_gettime() and similar calls using __...
+ calls
+
+This breaks potential infinite loops.
+---
+ src/libfaketime.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 105 insertions(+), 6 deletions(-)
+
+diff --git a/src/libfaketime.c b/src/libfaketime.c
+index 3ec372b..babda94 100644
+--- a/src/libfaketime.c
++++ b/src/libfaketime.c
+@@ -115,6 +115,9 @@ 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);
+ #ifndef __APPLE__
++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);
+ #ifdef FAKE_TIMERS
+ static int (*real_timer_settime_22) (int timerid, int flags, const struct itimerspec *new_value,
+ struct itimerspec * old_value);
+@@ -1865,23 +1868,119 @@ int clock_get_time(clock_serv_t clock_serv, mach_timespec_t *cur_timeclockid_t)
+ #ifdef FAKE_INTERNAL_CALLS
+ int __gettimeofday(struct timeval *tv, void *tz)
+ {
+- return gettimeofday(tv, tz);
++ int result;
++
++ /* sanity check */
++ if (tv == NULL)
++ {
++ return -1;
++ }
++
++ /* Check whether we've got a pointer to the real ftime() function yet */
++ if (NULL == real___gettimeofday)
++ { /* dlsym() failed */
++#ifdef DEBUG
++ (void) fprintf(stderr, "faketime problem: original __gettimeofday() not found.\n");
++#endif
++ return -1; /* propagate error to caller */
++ }
++
++ /* initialize our result with the real current time */
++ DONT_FAKE_TIME(result = (*real___gettimeofday)(tv, tz));
++ if (result == -1) return result; /* original function failed */
++
++ /* pass the real current time to our faking version, overwriting it */
++ result = fake_gettimeofday(tv);
++
++ /* return the result to the caller */
++ return result;
+ }
+
+ int __clock_gettime(clockid_t clk_id, struct timespec *tp)
+ {
+- return clock_gettime(clk_id, tp);
++ int result;
++
++ /* sanity check */
++ if (tp == NULL)
++ {
++ return -1;
++ }
++
++ if (NULL == real___clock_gettime)
++ { /* dlsym() failed */
++#ifdef DEBUG
++ (void) fprintf(stderr, "faketime problem: original __clock_gettime() not found.\n");
++#endif
++ return -1; /* propagate error to caller */
++ }
++
++ /* initialize our result with the real current time */
++ DONT_FAKE_TIME(result = (*real___clock_gettime)(clk_id, tp));
++ if (result == -1) return result; /* original function failed */
++
++ /* pass the real current time to our faking version, overwriting it */
++ result = fake_clock_gettime(clk_id, tp);
++
++ /* return the result to the caller */
++ return result;
+ }
+
+-int __ftime(struct timeb *tp)
++time_t __time(time_t *time_tptr)
+ {
+- return ftime(tp);
++ struct timespec tp;
++ time_t result;
++
++ DONT_FAKE_TIME(result = (*real___clock_gettime)(CLOCK_REALTIME, &tp));
++ if (result == -1) return -1;
++
++ /* pass the real current time to our faking version, overwriting it */
++ (void)fake_clock_gettime(CLOCK_REALTIME, &tp);
++
++ if (time_tptr != NULL)
++ {
++ *time_tptr = tp.tv_sec;
++ }
++ return tp.tv_sec;
+ }
+
+-time_t __time(time_t *time_tptr)
++int __ftime(struct timeb *tb)
+ {
+- return time(time_tptr);
++ struct timespec tp;
++ int result;
++
++ /* sanity check */
++ if (tb == NULL)
++ return 0; /* ftime() always returns 0, see manpage */
++
++ /* Check whether we've got a pointer to the real ftime() function yet */
++ if (NULL == real___ftime)
++ { /* dlsym() failed */
++#ifdef DEBUG
++ (void) fprintf(stderr, "faketime problem: original ftime() not found.\n");
++#endif
++ return 0; /* propagate error to caller */
++ }
++
++ /* initialize our TZ result with the real current time */
++ DONT_FAKE_TIME(result = (*real___ftime)(tb));
++ if (result == -1)
++ {
++ return result;
++ }
++
++ DONT_FAKE_TIME(result = (*real_clock_gettime)(CLOCK_REALTIME, &tp));
++ if (result == -1) return -1;
++
++ /* pass the real current time to our faking version, overwriting it */
++ (void)fake_clock_gettime(CLOCK_REALTIME, &tp);
++
++ tb->time = tp.tv_sec;
++ tb->millitm = tp.tv_nsec / 1000000;
++
++ /* return the result to the caller */
++ return result; /* will always be 0 (see manpage) */
+ }
++
+ #endif
+ #endif
+
+--
+1.9.0
+