<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>