<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/dffef76c1cc61d264302ceb5d158ce32c29615d6">https://github.com/macports/macports-legacy-support/commit/dffef76c1cc61d264302ceb5d158ce32c29615d6</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit dffef76c1cc61d264302ceb5d158ce32c29615d6
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Jun 20 18:27:04 2025 -0700
<span style='display:block; white-space:pre;color:#404040;'> time.c: Add boottime length check.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Since it's known that the malfunctioning boottime sysctl() reports the
</span><span style='display:block; white-space:pre;color:#404040;'> "correct" length for its incorrect result, it makes sense to check the
</span><span style='display:block; white-space:pre;color:#404040;'> length, in addition to the sanity check on the value.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Detects problem where expected when fix isn't present.
</span><span style='display:block; white-space:pre;color:#404040;'> Otherwise passes on all platforms.
</span>---
src/time.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/time.c b/src/time.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3a9ea24..4d7142f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -143,16 +143,23 @@ static pthread_mutex_t sleepofs_lock = PTHREAD_MUTEX_INITIALIZER;
</span> * this faster and with better resolution didn't appear until 10.12, where
* this code is no longer relevant.
*/
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BAD_BT_LEN -2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> static int
get_boottime(struct timeval *bt)
{
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret;
</span> size_t bt_len = sizeof(*bt);
int bt_mib[] = {CTL_KERN, KERN_BOOTTIME};
size_t bt_miblen = sizeof(bt_mib) / sizeof(bt_mib[0]);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- bt->tv_usec = 0; /* In case OS doesn't store it */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return sysctl(bt_mib, bt_miblen, bt, &bt_len, NULL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ret = sysctl(bt_mib, bt_miblen, bt, &bt_len, NULL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ret) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Check that result legth is correct */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (bt_len != sizeof(*bt)) return BAD_BT_LEN;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span> }
/*
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -194,10 +201,10 @@ get_todmach(sleepofs_info_t *si)
</span> static int
get_sleepofs_info(sleepofs_info_t *si)
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>- int tries;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret, tries;
</span> sleepofs_info_t si2;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (get_boottime(&si->boottime)) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((ret = get_boottime(&si->boottime))) return ret;
</span> si2.boottime = si->boottime;
while(1) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -209,7 +216,7 @@ get_sleepofs_info(sleepofs_info_t *si)
</span> if (si2.mach_diff < si->mach_diff) *si = si2;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (get_boottime(&si2.boottime)) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((ret = get_boottime(&si2.boottime))) return ret;
</span> if (si2.boottime.tv_sec == si->boottime.tv_sec
&& si2.boottime.tv_usec == si->boottime.tv_usec) break;
*si = si2;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -227,13 +234,18 @@ static int64_t tvdiff2mach(const struct timeval *tv1,
</span>
static void get_sleep_offset(void)
{
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret;
</span> int64_t toddiff, offset, minsleepadj, maxdrift;
sleepofs_info_t si;
static const struct timeval tv5a = {MIN_SLEEP_OFFSET_ADVANCE, 0},
tv5b = {0, 0};
if (get_mach_scale()) return;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (get_sleepofs_info(&si)) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ((ret = get_sleepofs_info(&si))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* If boottime is broken, retries are useless */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ret == BAD_BT_LEN) sleep_offset_valid = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
toddiff = tvdiff2mach(&si.timeofday, &si.boottime);
/* boottime later than tod is garbage */
</pre><pre style='margin:0'>
</pre>